bool run_server(program_state_t * state) { while (true) { queue_param_t param; param.state = state; param.client = accept(state->listener, NULL, NULL); if (param.client == INVALID_SOCKET) { continue; } if (!QueueWorkItem(state->tpool, (LPTHREAD_FUNC)queue_func, (BYTE*)¶m, sizeof(param), (LPCLBCK_FUNC)queue_func_callback)) { _tprintf(_T("QueueWorkItem failed\n")); break; } } return false; }
bool run_stress(program_state_t * state) { while (true) { queue_param_t param; param.state = state; if (!QueueWorkItem(state->tpool, (LPTHREAD_FUNC)queue_func, (BYTE*)¶m, sizeof(param), (LPCLBCK_FUNC)queue_func_callback)) { _tprintf(_T("QueueWorkItem failed\n")); break; } int res = WaitForSingleObject(state->exit_evt, state->interval_ms); if (res == WAIT_OBJECT_0) { // exit event return true; } else if (res != WAIT_TIMEOUT) { // some error break; } } return false; }
void TestThread(void *parameters) { WorkQueue_t lowPriWorkQueue; WorkQueue_t highPriWorkQueue; int rc; int lowCount; int highCount; (void)parameters; printf("Test Thread starting...\n"); while(1) { lowCount = 0; highCount = 1000; printf("[t] creating queues\n"); lowPriWorkQueue = CreateWorkQueue(); configASSERT(lowPriWorkQueue != NULL); highPriWorkQueue = CreateWorkQueueEx( "wq", DEFAULT_WORK_QUEUE_STACK_SIZE, 6); configASSERT(highPriWorkQueue != NULL); while(1) { rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(highPriWorkQueue, WorkItemFunction, (void *)(intptr_t)highCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(highPriWorkQueue, WorkItemFunction, (void *)(intptr_t)highCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(highPriWorkQueue, WorkItemFunction, (void *)(intptr_t)highCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(highPriWorkQueue, WorkItemFunction, (void *)(intptr_t)highCount++); configASSERT(rc == pdPASS); printf("[t] pausing\n"); vTaskDelay(500); if (lowCount > 100) { printf("[t] resetting queues\n"); DestroyWorkQueue(highPriWorkQueue); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); rc = QueueWorkItem(lowPriWorkQueue, WorkItemFunction, (void *)(intptr_t)lowCount++); configASSERT(rc == pdPASS); DestroyWorkQueue(lowPriWorkQueue); break; } } } configASSERT(!"CANNOT EXIT FROM A TASK"); }