MT#55283 use typed GQueue for ports release

Change-Id: I9cdaa88386c30f00ad4d18406b041ddb5c045e68
pull/1776/head
Richard Fuchs 2 years ago
parent f0eba3ca13
commit d23d9f8b42

@ -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 */ /* 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 */ /* global queue for sockets to be released, releasing by `sockets_releaser()` is done using that */
static GQueue ports_to_release_glob = G_QUEUE_INIT; static ports_release_q ports_to_release_glob = TYPED_GQUEUE_INIT;
mutex_t ports_to_release_glob_lock = MUTEX_STATIC_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 *); 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)); struct late_port_release *lpr = g_slice_alloc(sizeof(*lpr));
move_socket(&lpr->socket, r); move_socket(&lpr->socket, r);
lpr->spec = spec; 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) { static void free_port(socket_t *r, struct intf_spec *spec) {
release_port(r, spec); release_port(r, spec);
@ -983,11 +985,11 @@ enum thread_looper_action release_closed_sockets(void) {
if (ports_to_release_glob.head) { if (ports_to_release_glob.head) {
mutex_lock(&ports_to_release_glob_lock); mutex_lock(&ports_to_release_glob_lock);
GQueue ports_left = ports_to_release_glob; ports_release_q ports_left = ports_to_release_glob;
g_queue_init(&ports_to_release_glob); t_queue_init(&ports_to_release_glob);
mutex_unlock(&ports_to_release_glob_lock); 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); release_port_now(&lpr->socket, lpr->spec);
g_slice_free1(sizeof(*lpr), lpr); 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) { void append_thread_lpr_to_glob_lpr(void) {
mutex_lock(&ports_to_release_glob_lock); 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); mutex_unlock(&ports_to_release_glob_lock);
} }

@ -112,20 +112,6 @@ INLINE char *glib_json_print(JsonBuilder *builder) {
/* GQUEUE */ /* GQUEUE */
// appends `src` to the end of `dst` and clears out `src`
INLINE void g_queue_move(GQueue *dst, GQueue *src) {
if (!src->length)
return;
if (!dst->length) {
*dst = *src;
g_queue_init(src);
return;
}
dst->tail->next = src->head;
src->head->prev = dst->tail;
dst->length += src->length;
g_queue_init(src);
}
INLINE void g_queue_append(GQueue *dst, const GQueue *src) { INLINE void g_queue_append(GQueue *dst, const GQueue *src) {
GList *l; GList *l;
if (!src || !dst) if (!src || !dst)

Loading…
Cancel
Save