static int semaphore5_run(struct wboxtest *test, struct vmm_chardev *cdev, u32 test_hcpu) { int i, ret = VMM_OK; char wname[VMM_FIELD_NAME_SIZE]; u8 current_priority = vmm_scheduler_current_priority(); const struct vmm_cpumask *cpu_mask = vmm_cpumask_of(test_hcpu); /* Initialise global data */ memset(workers, 0, sizeof(workers)); /* Create worker threads */ for (i = 0; i < NUM_THREADS; i++) { vmm_snprintf(wname, VMM_FIELD_NAME_SIZE, "semaphore5_worker%d", i); workers[i] = vmm_threads_create(wname, semaphore5_worker_thread_main, (void *)(unsigned long)i, current_priority, VMM_THREAD_DEF_TIME_SLICE); if (workers[i] == NULL) { ret = VMM_EFAIL; goto destroy_workers; } vmm_threads_set_affinity(workers[i], cpu_mask); } /* Do the test */ ret = semaphore5_do_test(cdev); /* Destroy worker threads */ destroy_workers: for (i = 0; i < NUM_THREADS; i++) { if (workers[i]) { vmm_threads_destroy(workers[i]); workers[i] = NULL; } } return ret; }
static void daemon_mterm_exit(void) { vmm_threads_stop(mtctrl.thread); vmm_threads_destroy(mtctrl.thread); }