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;
	}