static struct snobj *handle_add_tc(struct snobj *q) { const char *tc_name; int wid; struct tc_params params; struct tc *c; tc_name = snobj_eval_str(q, "name"); if (!tc_name) return snobj_err(EINVAL, "Missing 'name' field"); if (!ns_is_valid_name(tc_name)) return snobj_err(EINVAL, "'%s' is an invalid name", tc_name); if (ns_name_exists(tc_name)) return snobj_err(EINVAL, "Name '%s' already exists", tc_name); wid = snobj_eval_uint(q, "wid"); if (wid >= MAX_WORKERS) return snobj_err(EINVAL, "'wid' must be between 0 and %d", MAX_WORKERS - 1); if (!is_worker_active(wid)) return snobj_err(EINVAL, "worker:%d does not exist", wid); memset(¶ms, 0, sizeof(params)); strcpy(params.name, tc_name); params.priority = snobj_eval_int(q, "priority"); if (params.priority == DEFAULT_PRIORITY) return snobj_err(EINVAL, "Priority %d is reserved", DEFAULT_PRIORITY); /* TODO */ params.share = 1; params.share_resource = RESOURCE_CNT; c = tc_init(workers[wid]->s, ¶ms); if (is_err(c)) return snobj_err(-ptr_to_err(c), "tc_init() failed"); tc_join(c); return NULL; }
int main(int argc, char *argv[]) { if (argc != 3) { printf("%s <num rands> <num threads>\n", argv[0]); exit(1); } uint64_t i, j, num_rands = atoi(argv[1]); uint64_t num_threads = atoi(argv[2]); srand(time(NULL)); TClient *clients = malloc(sizeof(TClient) * num_threads); ThreadArgs **args = malloc(sizeof(ThreadArgs *) * num_threads); for (i = 0; i < num_threads; i++) { init_thread_client(&clients[i]); args[i] = malloc(sizeof(ThreadArgs)); args[i]->i = i; args[i]->num_threads = num_threads; args[i]->num_rands = num_rands; } struct timeval rand32_r, rand128_r, normal_r;// result struct timeval rand32_s, rand128_s, normal_s;// start struct timeval rand32_e, rand128_e, normal_e;// end gettimeofday(&rand32_s, NULL); for (j = 0; j < num_threads; j++) tc_add_func(&clients[j], rand32_new, (void *) args[j]); for (j = 0; j < num_threads; j++) tc_join(&clients[j]); gettimeofday(&rand32_e, NULL); timeval_subtract(&rand32_r, &rand32_e, &rand32_s); gettimeofday(&rand128_s, NULL); for (j = 0; j < num_threads; j++) tc_add_func(&clients[j], rand128_new, (void *) args[j]); for (j = 0; j < num_threads; j++) tc_join(&clients[j]); gettimeofday(&rand128_e, NULL); timeval_subtract(&rand128_r, &rand128_e, &rand128_s); gettimeofday(&normal_s, NULL); for (j = 0; j < num_threads; j++) tc_add_func(&clients[j], normal_rand, (void *) args[j]); for (j = 0; j < num_threads; j++) tc_join(&clients[j]); gettimeofday(&normal_e, NULL); timeval_subtract(&normal_r, &normal_e, &normal_s); printf("rand32: "); PRINT_TIMEVAL(rand32_r); printf("\n"); printf("rand128: "); PRINT_TIMEVAL(rand128_r); printf("\n"); printf("normal: "); PRINT_TIMEVAL(normal_r); printf("\n"); for (i = 0; i < num_threads; i++) { tc_free(&clients[i]); free(args[i]); } free(args); free(clients); return 0; }