void *thread_cli_fun(void *arg) { double busy; int inx; Msg *msg; struct rusage r_start; struct rusage r_stop; struct timeval t_elapsed_data; struct timeval t_elapsed_total; struct timeval t_start_data; struct timeval t_start_total; struct timeval t_stop; arg = arg; // touch util_time_timer_start(&t_start_total); util_time_timer_start(&t_start_data); util_cpu_timer_start(&r_start); for (inx = 0; inx < loop; inx++) { if (verbose) printf("count=%d\n", inx); msg = msg_queue_remove(&mutex_pool, &queue_pool); assert(msg != NULL); if (csize) { msg->cbuf = (char *) malloc(csize); memcpy(msg->cbuf, send_buffer2, csize); } if (dsize) { msg->dbuf = (char *) malloc(dsize); memcpy(msg->dbuf, send_buffer, dsize); } msg_queue_add(&mutex_srv, &queue_srv, msg); cv_signal(&cv_srv); cv_wait(&cv_cli); msg = msg_queue_remove(&mutex_cli, &queue_cli); assert(msg != NULL); msg_queue_add(&mutex_pool, &queue_pool, msg); } util_cpu_timer_stop(&r_stop); util_time_timer_stop(&t_stop); util_time_elapsed(&t_start_total, &t_stop, &t_elapsed_total); util_time_elapsed(&t_start_data, &t_stop, &t_elapsed_data); util_cpu_timer_busy(&r_start, &r_stop, &t_elapsed_data, &busy); if (!bm) { print_elapsed("", &t_elapsed_total); print_elapsed(" (data)", &t_elapsed_data); } print_rate(bm, "", bidir ? 2 * loop : loop, dsize, &t_elapsed_data, busy); return NULL; }
void *thread_srv_fun(void *arg) { int inx; Msg *msg; arg = arg; // touch for (inx = 0; inx < loop; inx++) { cv_wait(&cv_srv); msg = msg_queue_remove(&mutex_srv, &queue_srv); assert(msg != NULL); if (!nocopy) { if (csize) memcpy(recv_buffer2, msg->cbuf, csize); if (dsize) memcpy(recv_buffer, msg->dbuf, dsize); } if (csize) free(msg->cbuf); if (dsize) free(msg->dbuf); if (bidir) { if (csize) memcpy(send_buffer2, recv_buffer2, csize); if (dsize) memcpy(send_buffer, recv_buffer, dsize); } msg_queue_add(&mutex_cli, &queue_cli, msg); cv_signal(&cv_cli); } return NULL; }
void msg_queue_destroy (struct msg_queue *queue) { while (queue->length > 0) msg_queue_remove (queue); xfree (queue); }