QSystemReadWriteLockPrivate::QSystemReadWriteLockPrivate(const QString &key, QSystemReadWriteLock::AccessMode mode) :m_key(key), m_counts(key + QLatin1String("_counts")), m_readerWait(key + QLatin1String("_readerWait"), 0, (mode==QSystemReadWriteLock::Create)?QSystemSemaphore::Create:QSystemSemaphore::Open), m_writerWait(key + QLatin1String("_writerWait"), 0, (mode==QSystemReadWriteLock::Create)?QSystemSemaphore::Create:QSystemSemaphore::Open), m_isInitialized(false), m_error(QSystemReadWriteLock::NoError), m_errorString(QString()) { bool isAttached = false; int retries=5; for (int i=0; i < retries; ++i){ if (m_counts.attach()) { isAttached = true; break; } else { if (m_counts.error() == QSharedMemory::NotFound) { if (m_counts.create(3 * sizeof(int))) { isAttached = true; break; } } } } if (!isAttached) { m_error = convertError(m_counts.error()); m_errorString = QObject::tr("QSystemReadWriteLockPrivate::QSystemReadWriteLockPrivate: " "Unable to create/attach to shared memory"); return; } else { if (mode == QSystemReadWriteLock::Create) { if(!m_counts.lock()) { m_error = convertError(m_counts.error()); m_errorString = QObject::tr("QSystemReadWriteLockPrivate::QSystemReadWriteLockPrivate: " "Unable to initialize shared memory"); return; } int * data = (int *)m_counts.data(); ::memset(data, 0, 3 * sizeof(int)); m_counts.unlock(); } m_isInitialized = true; } }
Protocol::Response::ReturnStatus SQLiteObjectStorage::ApplyReadWriteWorker::processReadWrite() { Error error = DatabaseLocked; SQLiteDBPtr db = mParent->mDB; int retries =mParent->mRetries; for(int tries = 0; tries < retries+1 && error != None; tries++) error = mParent->applyReadSet(db, *rws, *mResponse); if (error != None) { mResponse->set_return_status(convertError(error)); return mResponse->return_status(); }else {//FIXME do we want to abort the operation (note it's not a transaction) if we failed to read any items? I think so... error = DatabaseLocked; for(int tries = 0; tries < retries+1 && error != None; tries++) error = mParent->applyWriteSet(db, *rws, retries); if (error != None) { mResponse->set_return_status(convertError(error)); return mResponse->return_status(); } return convertError(None); } }
Protocol::Response::ReturnStatus SQLiteObjectStorage::ApplyTransactionWorker::processTransaction() { Error error = None; SQLiteDBPtr db = mParent->mDB; int retries=mParent->mRetries; int tries = retries + 1; while( tries > 0 ) { mParent->beginTransaction(db); error = mParent->checkCompareSet(db, *mt); Error read_error = None; read_error = mParent->applyReadSet(db, *mt, *mResponse); if (error==None) { error=read_error; } // Errors during compares or reads won't be resolved by retrying if (error != None) { mParent->rollbackTransaction(db); break; } error = mParent->applyWriteSet(db, *mt, 0); if (error != None) mParent->rollbackTransaction(db); else mParent->commitTransaction(db); tries--; } if (error != None) { mResponse->set_return_status(convertError(error)); return mResponse->return_status(); } return convertError(None); }
MainWindow::MainWindow(const QString &progName, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(this); setWindowTitle(progName); QMenu* file=new QMenu("&Файл"); file->addAction("&Оновити курси валют",this,SIGNAL(updateSignal()),QKeySequence("Ctrl+U")); file->addAction("&Налаштування",this,SIGNAL(settings())); file->addSeparator(); file->addAction("&Вихід",qApp,SLOT(quit()),QKeySequence("Ctrl+X")); ui->menuBar->addMenu(file); QMenu* find=new QMenu("&Пошук"); QSignalMapper* map=new QSignalMapper(this); connect(map,SIGNAL(mapped(int)),SIGNAL(find(int))); QAction* a; a=find->addAction("Максимальна вартість продажу",map,SLOT(map())); map->setMapping(a,maxSellType); a=find->addAction("Максимальна вартість купівлі",map,SLOT(map())); map->setMapping(a,maxBuyType); a=find->addAction("Мінімальна вартість продажу",map,SLOT(map())); map->setMapping(a,minSellType); a=find->addAction("Мінімальна вартість купівлі",map,SLOT(map())); map->setMapping(a,minBuyType); ui->menuBar->addMenu(find); auto tabWidget=new QTabWidget; auto cForm=new ConverterForm(tabWidget); auto rForm=new RateForm(tabWidget); tabWidget->addTab(cForm,"&Конвертер"); tabWidget->addTab(rForm,"Курси &валют"); setCentralWidget(tabWidget); connect(cForm,SIGNAL(convertError(UpdateError)),SIGNAL(convertError(UpdateError))); connect(this,SIGNAL(banksMayChange()),cForm,SLOT(setBankBox())); connect(this,SIGNAL(banksMayChange()),rForm,SLOT(setBankBox())); //cForm->show(); }
void handle(const ZhttpResponsePacket &packet) { if(state == ClientRequestStartWait) { if(packet.from.isEmpty()) { state = Stopped; errored = true; errorCondition = ErrorGeneric; cleanup(); log_warning("zhttp client: error id=%s initial ack for streamed input request did not contain from field", packet.id.data()); emit q->error(); return; } toAddress = packet.from; state = ClientRequesting; startKeepAlive(); } else if(state == ClientRequestFinishWait) { toAddress = packet.from; state = ClientReceiving; if(!doReq) startKeepAlive(); } if(packet.type == ZhttpResponsePacket::Error) { errored = true; errorCondition = convertError(packet.condition); log_debug("zhttp client: error id=%s cond=%s", packet.id.data(), packet.condition.data()); state = Stopped; cleanup(); emit q->error(); return; } else if(packet.type == ZhttpResponsePacket::Cancel) { log_debug("zhttp client: received cancel id=%s", packet.id.data()); errored = true; errorCondition = ErrorGeneric; state = Stopped; cleanup(); emit q->error(); return; } // if non-req mode, check sequencing if(!doReq && packet.seq != inSeq) { log_warning("zhttp client: error id=%s received message out of sequence, canceling", packet.id.data()); // if this was not an error packet, send cancel if(packet.type != ZhttpResponsePacket::Error && packet.type != ZhttpResponsePacket::Cancel) { ZhttpRequestPacket p; p.type = ZhttpRequestPacket::Cancel; writePacket(p); } state = Stopped; errored = true; errorCondition = ErrorGeneric; cleanup(); emit q->error(); return; } ++inSeq; refreshTimeout(); if(doReq && (packet.type != ZhttpResponsePacket::Data || packet.more)) { log_warning("zhttp/zws client req: received invalid req response"); state = Stopped; errored = true; errorCondition = ErrorGeneric; cleanup(); emit q->error(); return; } if(packet.type == ZhttpResponsePacket::Data) { if(!haveResponseValues) { haveResponseValues = true; responseCode = packet.code; responseReason = packet.reason; responseHeaders = packet.headers; } if(doReq) { if(responseBodyBuf.size() + packet.body.size() > REQ_BUF_MAX) log_warning("zhttp client req: id=%s server response too large", packet.id.data()); } else { if(responseBodyBuf.size() + packet.body.size() > IDEAL_CREDITS) log_warning("zhttp client: id=%s server is sending too fast", packet.id.data()); } responseBodyBuf += packet.body; if(!doReq && packet.credits > 0) { outCredits += packet.credits; if(outCredits > 0) { // try to write anything that was waiting on credits QPointer<QObject> self = this; tryWrite(); if(!self) return; } } if(packet.more) { if(!packet.body.isEmpty()) emit q->readyRead(); } else { // always emit readyRead here even if body is empty, for EOF state = Stopped; cleanup(); emit q->readyRead(); } } else if(packet.type == ZhttpResponsePacket::Credit) { if(packet.credits > 0) { outCredits += packet.credits; if(outCredits > 0) tryWrite(); } } else if(packet.type == ZhttpResponsePacket::KeepAlive) { // nothing to do } else { log_debug("zhttp client: unsupported packet type id=%s type=%d", packet.id.data(), (int)packet.type); } }
void handle(const ZhttpRequestPacket &packet) { if(paused) return; if(packet.type == ZhttpRequestPacket::Error) { errored = true; errorCondition = convertError(packet.condition); log_debug("zhttp server: error id=%s cond=%s", packet.id.data(), packet.condition.data()); state = Stopped; cleanup(); emit q->error(); return; } else if(packet.type == ZhttpRequestPacket::Cancel) { log_debug("zhttp server: received cancel id=%s", packet.id.data()); errored = true; errorCondition = ErrorGeneric; state = Stopped; cleanup(); emit q->error(); return; } if(packet.seq != inSeq) { log_warning("zhttp server: error id=%s received message out of sequence, canceling", packet.id.data()); // if this was not an error packet, send cancel if(packet.type != ZhttpRequestPacket::Error && packet.type != ZhttpRequestPacket::Cancel) { ZhttpResponsePacket p; p.type = ZhttpResponsePacket::Cancel; writePacket(p); } state = Stopped; errored = true; errorCondition = ErrorGeneric; cleanup(); emit q->error(); return; } ++inSeq; refreshTimeout(); if(packet.type == ZhttpRequestPacket::Data) { requestBodyBuf += packet.body; bool done = haveRequestBody; if(!packet.more) { haveRequestBody = true; state = ServerResponseWait; } if(packet.credits > 0) outCredits += packet.credits; if(!packet.body.isEmpty() || (!done && haveRequestBody)) emit q->readyRead(); } else if(packet.type == ZhttpRequestPacket::Credit) { if(packet.credits > 0) { outCredits += packet.credits; tryWrite(); } } else if(packet.type == ZhttpRequestPacket::KeepAlive) { // nothing to do } else if(packet.type == ZhttpRequestPacket::HandoffProceed) { if(pausing) { pausing = false; paused = true; emit q->paused(); } } else { log_debug("zhttp server: unsupported packet type id=%s type=%d", packet.id.data(), (int)packet.type); } }
void handle(const ZhttpResponsePacket &packet) { if(packet.type == ZhttpResponsePacket::Error) { errorCondition = convertError(packet.condition); log_debug("zws client: error id=%s cond=%s", packet.id.data(), packet.condition.data()); responseCode = packet.code; responseReason = packet.reason; responseHeaders = packet.headers; responseBody = packet.body; state = Idle; cleanup(); emit q->error(); return; } else if(packet.type == ZhttpResponsePacket::Cancel) { log_debug("zws client: received cancel id=%s", packet.id.data()); errorCondition = ErrorGeneric; state = Idle; cleanup(); emit q->error(); return; } if(!packet.from.isEmpty()) toAddress = packet.from; if(packet.seq != inSeq) { log_warning("zws client: error id=%s received message out of sequence, canceling", packet.id.data()); tryRespondCancel(packet); state = Idle; errorCondition = ErrorGeneric; cleanup(); emit q->error(); return; } if(!toAddress.isEmpty() && !keepAliveTimer->isActive()) startKeepAlive(); ++inSeq; refreshTimeout(); if(state == Connecting) { if(packet.type != ZhttpResponsePacket::Data && packet.type != ZhttpResponsePacket::Credit && packet.type != ZhttpResponsePacket::KeepAlive) { state = Idle; errorCondition = ErrorGeneric; cleanup(); log_warning("zws client: error id=%s initial response wrong type", packet.id.data()); emit q->error(); return; } if(packet.from.isEmpty()) { state = Idle; errorCondition = ErrorGeneric; cleanup(); log_warning("zws client: error id=%s initial ack did not contain from field", packet.id.data()); emit q->error(); return; } } if(packet.type == ZhttpResponsePacket::Data || packet.type == ZhttpResponsePacket::Ping || packet.type == ZhttpResponsePacket::Pong) { if(state == Connecting) { // this is assured earlier assert(packet.type == ZhttpResponsePacket::Data); responseCode = packet.code; responseReason = packet.reason; responseHeaders = packet.headers; if(packet.credits > 0) outCredits += packet.credits; state = Connected; update(); emit q->connected(); } else { if(inSize + packet.body.size() > IDEAL_CREDITS) log_warning("zws client: id=%s server is sending too fast", packet.id.data()); if(packet.type == ZhttpResponsePacket::Data) { handleIncomingDataPacket(packet.contentType, packet.body, packet.more); } else if(packet.type == ZhttpResponsePacket::Ping) { inFrames += Frame(Frame::Ping, packet.body, false); inSize += packet.body.size(); } else if(packet.type == ZhttpResponsePacket::Pong) { inFrames += Frame(Frame::Pong, packet.body, false); inSize += packet.body.size(); } if(packet.credits > 0) { outCredits += packet.credits; if(outCredits > 0) { // try to write anything that was waiting on credits QPointer<QObject> self = this; tryWrite(); if(!self) return; } } emit q->readyRead(); } } else if(packet.type == ZhttpResponsePacket::Close) { handlePeerClose(packet.code); } else if(packet.type == ZhttpResponsePacket::Credit) { if(packet.credits > 0) { outCredits += packet.credits; if(outCredits > 0) tryWrite(); } } else if(packet.type == ZhttpResponsePacket::KeepAlive) { // nothing to do } else { log_debug("zws client: unsupported packet type id=%s type=%d", packet.id.data(), (int)packet.type); } }
void handle(const ZhttpRequestPacket &packet) { if(packet.type == ZhttpRequestPacket::Error) { errorCondition = convertError(packet.condition); log_debug("zws server: error id=%s cond=%s", packet.id.data(), packet.condition.data()); state = Idle; cleanup(); emit q->error(); return; } else if(packet.type == ZhttpRequestPacket::Cancel) { log_debug("zws server: received cancel id=%s", packet.id.data()); errorCondition = ErrorGeneric; state = Idle; cleanup(); emit q->error(); return; } if(packet.seq != inSeq) { log_warning("zws server: error id=%s received message out of sequence, canceling", packet.id.data()); tryRespondCancel(packet); state = Idle; errorCondition = ErrorGeneric; cleanup(); emit q->error(); return; } ++inSeq; refreshTimeout(); if(packet.type == ZhttpRequestPacket::Data || packet.type == ZhttpRequestPacket::Ping || packet.type == ZhttpRequestPacket::Pong) { if(inSize + packet.body.size() > IDEAL_CREDITS) log_warning("zws client: id=%s server is sending too fast", packet.id.data()); if(packet.type == ZhttpRequestPacket::Data) { handleIncomingDataPacket(packet.contentType, packet.body, packet.more); } else if(packet.type == ZhttpRequestPacket::Ping) { inFrames += Frame(Frame::Ping, packet.body, false); inSize += packet.body.size(); } else if(packet.type == ZhttpRequestPacket::Pong) { inFrames += Frame(Frame::Pong, packet.body, false); inSize += packet.body.size(); } if(packet.credits > 0) { outCredits += packet.credits; if(outCredits > 0) { // try to write anything that was waiting on credits QPointer<QObject> self = this; tryWrite(); if(!self) return; } } emit q->readyRead(); } else if(packet.type == ZhttpRequestPacket::Close) { handlePeerClose(packet.code); } else if(packet.type == ZhttpRequestPacket::Credit) { if(packet.credits > 0) { outCredits += packet.credits; tryWrite(); } } else if(packet.type == ZhttpRequestPacket::KeepAlive) { // nothing to do } else { log_debug("zws server: unsupported packet type id=%s type=%d", packet.id.data(), (int)packet.type); } }