void OtlConnection::workThreadRun() { while (mbWorkThreadKeepRunning || getTaskCount(mkWorkThreadExecuteTasksQueue, mkWorkThreadExecuteTasksQueueMutex) || getTaskCount(mkWorkThreadFinishTasksQueue, mkWorkThreadFinishTasksQueueMutex) || getTaskCount(mkWorkThreadDeleteTasksQueue, mkWorkThreadDeleteTasksQueueMutex)) { OtlTask *pkTask = popWorkThreadExecuteTask(); if (pkTask) { pkTask->execute(this); if (pkTask->getFinishedOnWorkThread()) { pushWorkThreadFinishTask(pkTask); } else { pushMainThreadFinishTask(pkTask); } } pkTask = popWorkThreadFinishTask(); if (pkTask) { pkTask->finish(); if (pkTask->getAutoDelete()) { if (pkTask->getDeleteOnWorkThread()) { pushWorkThreadDeleteTask(pkTask); } else { pushMainThreadDeleteTask(pkTask); } } } pkTask = popWorkThreadDeleteTask(); if (pkTask) { delete pkTask; } } mbWorkThreadExisted = true; }
static bool handleQueryAll(int size, const byte *msg, CONTEXT *context) { byte bind = msg[1]; TASK *task = firstTask; int taskCount = getTaskCount(); byte* localMem = (byte *) malloc(taskCount+2); byte* local = &localMem[2]; int i = 0; if (!localMem) { #ifdef DEBUG sendStringf("hQA: M"); #endif return false; } localMem[0] = EXPR_L(EXPR_LIT); while(task != NULL && i < taskCount) { *local++ = task->id; task = task->next; i++; } localMem[1] = i; if (context->codeBlock || context->task) { putBindListPtr(context, bind, localMem); } else { sendReply(i+2, SCHED_RESP_QUERY_ALL, localMem, context, bind); free(localMem); } return false; }
bool OtlConnection::close() { mbWorkThreadKeepRunning = false; while (!mbWorkThreadExisted || getTaskCount(mkMainThreadExecuteTasksQueue, mkMainThreadExecuteTasksQueueMutex) || getTaskCount(mkMainThreadFinishTasksQueue, mkMainThreadFinishTasksQueueMutex) || getTaskCount(mkMainThreadDeleteTasksQueue, mkMainThreadDeleteTasksQueueMutex) || getTaskCount(mkWorkThreadExecuteTasksQueue, mkWorkThreadExecuteTasksQueueMutex) || getTaskCount(mkWorkThreadFinishTasksQueue, mkWorkThreadFinishTasksQueueMutex) || getTaskCount(mkWorkThreadDeleteTasksQueue, mkWorkThreadDeleteTasksQueueMutex)) { mainThreadRun(); } mkThreadGroup.join_all(); mOtlDBConnection.logoff(); return true; }