static int server_thread(void *arg) { pj_time_val timeout = { 0, 1 }; unsigned thread_index = (unsigned)(long)arg; pj_time_val last_report, next_report; pj_gettimeofday(&last_report); next_report = last_report; next_report.sec++; while (!app.thread_quit) { pj_time_val now; unsigned i; for (i=0; i<100; ++i) { unsigned count = 0; pjsip_endpt_handle_events2(app.sip_endpt, &timeout, &count); if (count == 0) break; } if (thread_index == 0) { pj_gettimeofday(&now); if (PJ_TIME_VAL_GTE(now, next_report)) { pj_time_val tmp; unsigned msec; unsigned stateless, stateful, call; char str_stateless[32], str_stateful[32], str_call[32]; tmp = now; PJ_TIME_VAL_SUB(tmp, last_report); msec = PJ_TIME_VAL_MSEC(tmp); last_report = now; next_report = last_report; next_report.sec++; stateless = app.server.cur_state.stateless_cnt - app.server.prev_state.stateless_cnt; stateful = app.server.cur_state.stateful_cnt - app.server.prev_state.stateful_cnt; call = app.server.cur_state.call_cnt - app.server.prev_state.call_cnt; good_number(str_stateless, app.server.cur_state.stateless_cnt); good_number(str_stateful, app.server.cur_state.stateful_cnt); good_number(str_call, app.server.cur_state.call_cnt); printf("Total(rate): stateless:%s (%d/s), statefull:%s (%d/s), call:%s (%d/s) \r", str_stateless, stateless*1000/msec, str_stateful, stateful*1000/msec, str_call, call*1000/msec); fflush(stdout); app.server.prev_state = app.server.cur_state; } } } return 0; }
int transport_load_test(char *target_url) { enum { COUNT = 2000 }; unsigned i; pj_status_t status = PJ_SUCCESS; /* exhaust packets */ do { pj_time_val delay = {1, 0}; i = 0; pjsip_endpt_handle_events2(endpt, &delay, &i); } while (i != 0); PJ_LOG(3,(THIS_FILE, " transport load test...")); if (mod_load.mod.id == -1) { status = pjsip_endpt_register_module( endpt, &mod_load.mod); if (status != PJ_SUCCESS) { app_perror("error registering module", status); return -1; } } mod_load.err = PJ_FALSE; mod_load.next_seq = 0; for (i=0; i<COUNT && !mod_load.err; ++i) { pj_str_t target, from, call_id; pjsip_tx_data *tdata; target = pj_str(target_url); from = pj_str("<sip:user@host>"); call_id = pj_str("thecallid"); status = pjsip_endpt_create_request(endpt, &pjsip_invite_method, &target, &from, &target, &from, &call_id, i, NULL, &tdata ); if (status != PJ_SUCCESS) { app_perror("error creating request", status); goto on_return; } status = pjsip_endpt_send_request_stateless(endpt, tdata, NULL, NULL); if (status != PJ_SUCCESS) { app_perror("error sending request", status); goto on_return; } } do { pj_time_val delay = {1, 0}; i = 0; pjsip_endpt_handle_events2(endpt, &delay, &i); } while (i != 0); if (mod_load.next_seq != COUNT) { PJ_LOG(1,("THIS_FILE", " err: expecting %u msg, got only %u", COUNT, mod_load.next_seq)); status = -2; goto on_return; } on_return: if (mod_load.mod.id != -1) { pjsip_endpt_unregister_module( endpt, &mod_load.mod); mod_load.mod.id = -1; } if (status != PJ_SUCCESS || mod_load.err) { return -2; } PJ_LOG(3,(THIS_FILE, " success")); return 0; }
/* Client worker thread */ static int client_thread(void *arg) { pj_time_val end_time, last_report, now; unsigned thread_index = (unsigned)(long)arg; unsigned cycle = 0, last_cycle = 0; pj_thread_sleep(100); pj_gettimeofday(&end_time); end_time.sec += app.client.timeout; pj_gettimeofday(&last_report); if (app.client.first_request.sec == 0) { pj_gettimeofday(&app.client.first_request); } /* Submit all jobs */ while (app.client.job_submitted < app.client.job_count && !app.thread_quit){ pj_time_val timeout = { 0, 1 }; unsigned i; int outstanding; pj_status_t status; /* Calculate current outstanding job */ outstanding = app.client.job_submitted - app.client.job_finished; /* Update stats on max outstanding jobs */ if (outstanding > (int)app.client.stat_max_window) app.client.stat_max_window = outstanding; /* Wait if there are more pending jobs than allowed in the * window. But spawn a new job anyway if no events are happening * after we wait for some time. */ for (i=0; outstanding > (int)app.client.job_window && i<1000; ++i) { pj_time_val wait = { 0, 500 }; unsigned count = 0; pjsip_endpt_handle_events2(app.sip_endpt, &wait, &count); outstanding = app.client.job_submitted - app.client.job_finished; if (count == 0) break; ++cycle; } /* Submit one job */ if (app.client.method.id == PJSIP_INVITE_METHOD) { status = make_call(&app.client.dst_uri); } else if (app.client.stateless) { status = submit_stateless_job(); } else { status = submit_job(); } ++app.client.job_submitted; ++cycle; /* Handle event */ pjsip_endpt_handle_events2(app.sip_endpt, &timeout, NULL); /* Check for time out, also print report */ if (cycle - last_cycle >= 500) { pj_gettimeofday(&now); if (PJ_TIME_VAL_GTE(now, end_time)) { break; } last_cycle = cycle; if (thread_index == 0 && now.sec-last_report.sec >= 2) { printf("\r%d jobs started, %d completed... ", app.client.job_submitted, app.client.job_finished); fflush(stdout); last_report = now; } } } if (app.client.requests_sent.sec == 0) { pj_gettimeofday(&app.client.requests_sent); } if (thread_index == 0) { printf("\r%d jobs started, %d completed%s\n", app.client.job_submitted, app.client.job_finished, (app.client.job_submitted!=app.client.job_finished ? ", waiting..." : ".") ); fflush(stdout); } /* Wait until all jobs completes, or timed out */ pj_gettimeofday(&now); while (PJ_TIME_VAL_LT(now, end_time) && app.client.job_finished < app.client.job_count && !app.thread_quit) { pj_time_val timeout = { 0, 1 }; unsigned i; for (i=0; i<1000; ++i) { unsigned count; count = 0; pjsip_endpt_handle_events2(app.sip_endpt, &timeout, &count); if (count == 0) break; } pj_gettimeofday(&now); } /* Wait couple of seconds to let jobs completes (e.g. ACKs to be sent) */ pj_gettimeofday(&now); end_time = now; end_time.sec += 2; while (PJ_TIME_VAL_LT(now, end_time)) { pj_time_val timeout = { 0, 1 }; unsigned i; for (i=0; i<1000; ++i) { unsigned count; count = 0; pjsip_endpt_handle_events2(app.sip_endpt, &timeout, &count); if (count == 0) break; } pj_gettimeofday(&now); } return 0; }