|
|
|
|
@ -99,11 +99,13 @@ struct interface_stats_interval {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TYPED_GQUEUE(ports_release, struct late_port_release)
|
|
|
|
|
|
|
|
|
|
/* thread scope (local) queue for sockets to be released, only appending here */
|
|
|
|
|
static __thread GQueue ports_to_release = G_QUEUE_INIT;
|
|
|
|
|
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 */
|
|
|
|
|
static GQueue ports_to_release_glob = G_QUEUE_INIT;
|
|
|
|
|
mutex_t ports_to_release_glob_lock = MUTEX_STATIC_INIT;
|
|
|
|
|
static ports_release_q ports_to_release_glob = TYPED_GQUEUE_INIT;
|
|
|
|
|
static mutex_t ports_to_release_glob_lock = MUTEX_STATIC_INIT;
|
|
|
|
|
|
|
|
|
|
static const struct streamhandler *__determine_handler(struct packet_stream *in, struct sink_handler *);
|
|
|
|
|
|
|
|
|
|
@ -937,7 +939,7 @@ static void release_port(socket_t *r, struct intf_spec *spec) {
|
|
|
|
|
struct late_port_release *lpr = g_slice_alloc(sizeof(*lpr));
|
|
|
|
|
move_socket(&lpr->socket, r);
|
|
|
|
|
lpr->spec = spec;
|
|
|
|
|
g_queue_push_tail(&ports_to_release, lpr);
|
|
|
|
|
t_queue_push_tail(&ports_to_release, lpr);
|
|
|
|
|
}
|
|
|
|
|
static void free_port(socket_t *r, struct intf_spec *spec) {
|
|
|
|
|
release_port(r, spec);
|
|
|
|
|
@ -983,11 +985,11 @@ enum thread_looper_action release_closed_sockets(void) {
|
|
|
|
|
|
|
|
|
|
if (ports_to_release_glob.head) {
|
|
|
|
|
mutex_lock(&ports_to_release_glob_lock);
|
|
|
|
|
GQueue ports_left = ports_to_release_glob;
|
|
|
|
|
g_queue_init(&ports_to_release_glob);
|
|
|
|
|
ports_release_q ports_left = ports_to_release_glob;
|
|
|
|
|
t_queue_init(&ports_to_release_glob);
|
|
|
|
|
mutex_unlock(&ports_to_release_glob_lock);
|
|
|
|
|
|
|
|
|
|
while ((lpr = g_queue_pop_head(&ports_left))) {
|
|
|
|
|
while ((lpr = t_queue_pop_head(&ports_left))) {
|
|
|
|
|
release_port_now(&lpr->socket, lpr->spec);
|
|
|
|
|
g_slice_free1(sizeof(*lpr), lpr);
|
|
|
|
|
}
|
|
|
|
|
@ -1000,7 +1002,7 @@ enum thread_looper_action release_closed_sockets(void) {
|
|
|
|
|
*/
|
|
|
|
|
void append_thread_lpr_to_glob_lpr(void) {
|
|
|
|
|
mutex_lock(&ports_to_release_glob_lock);
|
|
|
|
|
g_queue_move(&ports_to_release_glob, &ports_to_release); /* dst, src */
|
|
|
|
|
t_queue_move(&ports_to_release_glob, &ports_to_release); /* dst, src */
|
|
|
|
|
mutex_unlock(&ports_to_release_glob_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|