|
|
|
@ -82,19 +82,24 @@ struct packet_handler_ctx { |
|
|
|
// output: |
|
|
|
struct media_packet mp; // passed to handlers |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct late_port_release; |
|
|
|
TYPED_GQUEUE(ports_release, struct late_port_release) |
|
|
|
|
|
|
|
struct late_port_release { |
|
|
|
ports_release_list link; |
|
|
|
socket_t socket; |
|
|
|
struct port_pool *pp; |
|
|
|
ports_q pp_links; |
|
|
|
}; |
|
|
|
|
|
|
|
struct interface_stats_interval { |
|
|
|
struct interface_stats_block stats; |
|
|
|
int64_t last_run; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
TYPED_GQUEUE(ports_release, struct late_port_release) |
|
|
|
|
|
|
|
/* thread scope (local) queue for sockets to be released, only appending here */ |
|
|
|
static __thread ports_release_q ports_to_release = TYPED_GQUEUE_INIT; |
|
|
|
/* global queue for sockets to be released, releasing by `sockets_releaser()` is done using that */ |
|
|
|
@ -1088,13 +1093,14 @@ static bool add_socket(socket_t *r, unsigned int port, struct intf_spec *spec, c |
|
|
|
static void release_port_push(void *p) { |
|
|
|
struct late_port_release *lpr = p; |
|
|
|
__C_DBG("Adding the port '%u' to late-release list", lpr->socket.local.port); |
|
|
|
t_queue_push_tail(&ports_to_release, lpr); |
|
|
|
t_queue_push_tail_link(&ports_to_release, &lpr->link); |
|
|
|
} |
|
|
|
static void release_port_poller(struct socket_port_link *spl, struct poller *poller) { |
|
|
|
if (!spl->socket.local.port || spl->socket.fd == -1) |
|
|
|
return; |
|
|
|
struct late_port_release *lpr = g_new(__typeof(*lpr), 1); |
|
|
|
move_socket(&lpr->socket, &spl->socket); |
|
|
|
lpr->link = (ports_release_list) { .data = lpr }; |
|
|
|
lpr->pp = spl->pp; |
|
|
|
lpr->pp_links = spl->links; |
|
|
|
if (!poller) |
|
|
|
@ -1135,8 +1141,6 @@ static void release_port_now(socket_t *r, ports_q *list, struct port_pool *pp) { |
|
|
|
* Sockets releaser. |
|
|
|
*/ |
|
|
|
enum thread_looper_action release_closed_sockets(void) { |
|
|
|
struct late_port_release * lpr; |
|
|
|
|
|
|
|
/* for the separate releaser thread (one working with `sockets_releaser()`) |
|
|
|
* it does no job. But only for those threads related to calls processing. |
|
|
|
*/ |
|
|
|
@ -1149,7 +1153,9 @@ enum thread_looper_action release_closed_sockets(void) { |
|
|
|
t_queue_init(&ports_to_release_glob); |
|
|
|
mutex_unlock(&ports_to_release_glob_lock); |
|
|
|
|
|
|
|
while ((lpr = t_queue_pop_head(&ports_left))) { |
|
|
|
while (ports_left.length) { |
|
|
|
__auto_type lpr_link = t_queue_pop_head_link(&ports_left); |
|
|
|
__auto_type lpr = lpr_link->data; |
|
|
|
release_port_now(&lpr->socket, &lpr->pp_links, lpr->pp); |
|
|
|
g_free(lpr); |
|
|
|
} |
|
|
|
|