/// Worker threads handle most SIP message processing. static int worker_thread(void* p) { // Set up data to always process incoming messages at the first PJSIP // module after our module. pjsip_process_rdata_param rp; pjsip_process_rdata_param_default(&rp); rp.start_mod = &mod_stack; rp.idx_after_start = 1; LOG_DEBUG("Worker thread started"); struct rx_msg_qe qe = {0}; while (rx_msg_q.pop(qe)) { pjsip_rx_data* rdata = qe.rdata; if (rdata) { LOG_DEBUG("Worker thread dequeue message %p", rdata); pjsip_endpt_process_rx_data(stack_data.endpt, rdata, &rp, NULL); LOG_DEBUG("Worker thread completed processing message %p", rdata); pjsip_rx_data_free_cloned(rdata); struct timespec done_time; if (clock_gettime(CLOCK_MONOTONIC, &done_time) == 0) { long latency_us = (done_time.tv_nsec - qe.rx_time.tv_nsec) / 1000L + (done_time.tv_sec - qe.rx_time.tv_sec) * 1000000L; LOG_DEBUG("Request latency = %ldus", latency_us); latency_accumulator->accumulate(latency_us); latency_accumulator->refresh(); } else { LOG_ERROR("Failed to get done timestamp: %s", strerror(errno)); } } } LOG_DEBUG("Worker thread ended"); return 0; }
/// Worker threads handle most SIP message processing. static int worker_thread(void* p) { // Set up data to always process incoming messages at the first PJSIP // module after our module. pjsip_process_rdata_param rp; pjsip_process_rdata_param_default(&rp); rp.start_mod = &mod_stack; rp.idx_after_start = 1; LOG_DEBUG("Worker thread started"); struct rx_msg_qe qe = {0}; while (rx_msg_q.pop(qe)) { pjsip_rx_data* rdata = qe.rdata; if (rdata) { LOG_DEBUG("Worker thread dequeue message %p", rdata); pjsip_endpt_process_rx_data(stack_data.endpt, rdata, &rp, NULL); LOG_DEBUG("Worker thread completed processing message %p", rdata); pjsip_rx_data_free_cloned(rdata); unsigned long latency_us; if (qe.stop_watch.read(latency_us)) { LOG_DEBUG("Request latency = %ldus", latency_us); latency_accumulator->accumulate(latency_us); load_monitor->request_complete(latency_us); } else { LOG_ERROR("Failed to get done timestamp: %s", strerror(errno)); } } } LOG_DEBUG("Worker thread ended"); return 0; }