#include "test.h" #include #include #include #include struct test_work_data { int job_id; int runs; }; int num_complete; pthread_mutex_t test_lock; int test_work_runner(void *arg) { struct test_work_data *d = arg; usleep(1000); if (++d->runs == 5) { pthread_mutex_lock(&test_lock); num_complete++; pthread_mutex_unlock(&test_lock); return WORK_DONE; } return WORK_YIELD; } #define NUM_JOBS 20 #define NUM_WORKERS 5 int test_workqueue() { int i; workqueue_t wq; work_t work[NUM_JOBS] = {0}; struct test_work_data data[NUM_JOBS] = {0}; pthread_mutex_init(&test_lock, NULL); workqueue_create(&wq, NUM_WORKERS); mod_printf("Created %d workers", NUM_WORKERS); for (i = 0; i < NUM_JOBS; i++) { data[i].job_id = i; work[i].work_fn = test_work_runner; work[i].arg = &data[i]; workqueue_add_work(&wq, &work[i]); } while (num_complete != NUM_JOBS); mod_printf("Completed %d jobs", NUM_JOBS); workqueue_destroy(&wq); pthread_mutex_destroy(&test_lock); return 0; } TEST_DEF(workqueue) { TEST_MOD_INIT(); TEST_MOD_EXEC( test_workqueue() ); TEST_MOD_REPORT(); }