int main(int argc, char **argv) { // for (int i=1; i<NSIG; i++) { // //if (signal(SIGINT, sig_handler) == SIG_ERR) printf("\ncan't catch SIGINT\n"); // if (signal(i, sig_handler) == SIG_ERR) printf("\ncan't catch %s\n", strsignal(i)); // } signal(SIGPIPE, SIG_IGN); apr_initialize(); apr_pool_create(&mp_rpc_, NULL); apr_thread_cond_create(&cd_rpc_, mp_rpc_); apr_thread_mutex_create(&mx_rpc_, APR_THREAD_MUTEX_UNNESTED, mp_rpc_); rpc_init(); arg_parse(argc, argv); ADD = is_fast_ ? FAST_ADD : SLOW_ADD; bool exit = false; exit |= !(is_server_ || is_client_); exit |= (addr_ == NULL); exit |= (port_ == 0); if (exit) { fprintf(stderr, "wrong arguments.\n"); usage(argv[0]); return 0; } if (is_server_) { server_t *server = NULL; poll_mgr_t *mgr_server = NULL; poll_mgr_create(&mgr_server, n_server_thread_); server_create(&server, mgr_server); strcpy(server->comm->ip, addr_); server->comm->port = port_; server_reg(server, ADD, add); server_start(server); LOG_INFO("server started start on %s, port %d.", addr_, port_); } if (is_client_) { LOG_INFO("client to %s:%d, test for %d rpc in total, outstanding rpc: %d", addr_, port_, max_rpc_, max_outst_); mgrs_ = (poll_mgr_t **) malloc(n_client_ * sizeof(poll_mgr_t*)); clis_ = (client_t **) malloc(n_client_ * sizeof(client_t *)); n_issues_ = (uint64_t*) malloc(n_client_ * sizeof(uint64_t)); n_callbacks_ = (uint64_t*) malloc(n_client_ * sizeof(uint64_t)); n_active_cli_ = n_client_; apr_thread_mutex_lock(mx_rpc_); for (int i = 0; i < n_client_; i++) { apr_thread_t *th; apr_thread_create(&th, NULL, client_thread, (intptr_t) i, mp_rpc_); } if (max_rpc_ < 0) { LOG_INFO("infinite rpc on %d threads (clients)", n_client_); } else { LOG_INFO("%d threads (clients), each client run for %d rpc.", n_client_, max_rpc_ * n_client_); } apr_thread_cond_wait(cd_rpc_, mx_rpc_); apr_thread_mutex_unlock(mx_rpc_); int period = (tm_end_ - tm_begin_); //micro seconds LOG_INFO("finish %d rpc in %d ms.", max_rpc_ * n_client_, period/1000); float rate = (float) max_rpc_ * n_client_ / period; LOG_INFO("rpc rate %f million per sec.", rate); for (int i = 0; i < n_client_; i++) { client_destroy(clis_[i]); poll_mgr_destroy(mgrs_[i]); } free (clis_); free (n_issues_); } fflush(stdout); fflush(stderr); while(is_server_) { apr_sleep(1000000); } rpc_destroy(); atexit(apr_terminate); }
int main(int argc, char **argv) { // for (int i=1; i<NSIG; i++) { // //if (signal(SIGINT, sig_handler) == SIG_ERR) printf("\ncan't catch SIGINT\n"); // if (signal(i, sig_handler) == SIG_ERR) printf("\ncan't catch %s\n", strsignal(i)); // } signal(SIGPIPE, SIG_IGN); apr_initialize(); apr_pool_create(&mp_rpc_, NULL); apr_thread_cond_create(&cd_rpc_, mp_rpc_); apr_thread_mutex_create(&mx_rpc_, APR_THREAD_MUTEX_UNNESTED, mp_rpc_); rpc_init(); arg_parse(argc, argv); bool exit = false; exit |= !(is_server_ || is_client_); exit |= (addr_ == NULL); exit |= (port_ == 0); if (exit) { fprintf(stderr, "wrong arguments.\n"); usage(argv[0]); return 0; } if (is_server_) { server_t *server = NULL; server_create(&server, NULL); strcpy(server->comm->ip, addr_); server->comm->port = port_; server_reg(server, ADD, add); server_start(server); LOG_INFO("server started start on %s, port %d.", addr_, port_); } if (is_client_) { LOG_INFO("client to %s:%d, test for %d rpc in total, outstanding rpc: %d", addr_, port_, max_rpc_, max_outst_); apr_thread_mutex_lock(mx_rpc_); for (int i = 0; i < n_client_; i++) { apr_thread_t *th; apr_thread_create(&th, NULL, client_thread, NULL, mp_rpc_); } LOG_INFO("rpc triggered for %d adds on %d threads.", max_rpc_ * n_client_, n_client_); apr_thread_cond_wait(cd_rpc_, mx_rpc_); apr_thread_mutex_unlock(mx_rpc_); int period = (tm_end_ - tm_begin_); //micro seconds LOG_INFO("finish %d rpc in %d ms.", max_rpc_ * n_client_, period/1000); float rate = (float) max_rpc_ * n_client_ / period; LOG_INFO("rpc rate %f million per sec.", rate); } fflush(stdout); fflush(stderr); while(is_server_) { apr_sleep(1000000); } rpc_destroy(); atexit(apr_terminate); }