Merge "res_pjsip/pjsip_transport_management.c: Fix deadlock with transport keep alive." into 13

13.23
Jenkins2 7 years ago committed by Gerrit Code Review
commit ba5668bb1f

@ -56,21 +56,22 @@ struct monitored_transport {
int sip_received; int sip_received;
}; };
/*! \brief Callback function to send keepalive */ static void keepalive_transport_send_keepalive(struct monitored_transport *monitored)
static int keepalive_transport_cb(void *obj, void *arg, int flags)
{ {
struct monitored_transport *monitored = obj;
pjsip_tpselector selector = { pjsip_tpselector selector = {
.type = PJSIP_TPSELECTOR_TRANSPORT, .type = PJSIP_TPSELECTOR_TRANSPORT,
.u.transport = monitored->transport, .u.transport = monitored->transport,
}; };
pjsip_tpmgr_send_raw(pjsip_endpt_get_tpmgr(ast_sip_get_pjsip_endpoint()), pjsip_tpmgr_send_raw(pjsip_endpt_get_tpmgr(ast_sip_get_pjsip_endpoint()),
monitored->transport->key.type, &selector, NULL, keepalive_packet.ptr, keepalive_packet.slen, monitored->transport->key.type,
&monitored->transport->key.rem_addr, pj_sockaddr_get_len(&monitored->transport->key.rem_addr), &selector,
NULL,
keepalive_packet.ptr,
keepalive_packet.slen,
&monitored->transport->key.rem_addr,
pj_sockaddr_get_len(&monitored->transport->key.rem_addr),
NULL, NULL); NULL, NULL);
return 0;
} }
/*! \brief Thread which sends keepalives to all active connection-oriented transports */ /*! \brief Thread which sends keepalives to all active connection-oriented transports */
@ -90,12 +91,26 @@ static void *keepalive_transport_thread(void *data)
return NULL; return NULL;
} }
/* Once loaded this module just keeps on going as it is unsafe to stop and change the underlying /*
* callback for the transport manager. * Once loaded this module just keeps on going as it is unsafe to stop
* and change the underlying callback for the transport manager.
*/ */
while (keepalive_interval) { while (keepalive_interval) {
struct ao2_iterator iter;
struct monitored_transport *monitored;
sleep(keepalive_interval); sleep(keepalive_interval);
ao2_callback(transports, OBJ_NODATA, keepalive_transport_cb, NULL);
/*
* We must use the iterator to avoid deadlock between the container lock
* and the pjproject transport manager group lock when sending
* the keepalive packet.
*/
iter = ao2_iterator_init(transports, 0);
for (; (monitored = ao2_iterator_next(&iter)); ao2_ref(monitored, -1)) {
keepalive_transport_send_keepalive(monitored);
}
ao2_iterator_destroy(&iter);
} }
ao2_ref(transports, -1); ao2_ref(transports, -1);

Loading…
Cancel
Save