diff --git a/daemon/control_tcp.c b/daemon/control_tcp.c index 370154396..d29981bd3 100644 --- a/daemon/control_tcp.c +++ b/daemon/control_tcp.c @@ -46,16 +46,15 @@ static void control_list(struct control_tcp *c, struct streambuf_stream *s) { mutex_lock(&c->listener.lock); - GList *streams = g_hash_table_get_values(c->listener.streams); - for (GList *l = streams; l; l = l->next) { - struct streambuf_stream *cl = l->data; + tcp_streams_ht_iter iter; + t_hash_table_iter_init(&iter, c->listener.streams); + struct streambuf_stream *cl; + + while (t_hash_table_iter_next(&iter, NULL, &cl)) streambuf_printf(s->outbuf, "%s\n", cl->addr); - } mutex_unlock(&c->listener.lock); - g_list_free(streams); - streambuf_printf(s->outbuf, "End.\n"); } diff --git a/daemon/tcp_listener.c b/daemon/tcp_listener.c index e68e76eeb..d41a41f54 100644 --- a/daemon/tcp_listener.c +++ b/daemon/tcp_listener.c @@ -26,6 +26,9 @@ struct streambuf_callback { struct obj *parent; }; +TYPED_GHASHTABLE_IMPL(tcp_streams_ht, g_direct_hash, g_direct_equal, NULL, NULL) + + static void tcp_listener_incoming(int fd, void *p, uintptr_t x) { struct tcp_listener_callback *cb = p; int ret; @@ -117,7 +120,7 @@ static void streambuf_stream_closed(int fd, void *p, uintptr_t u) { struct streambuf_listener *l = s->listener; mutex_lock(&l->lock); - int ret = g_hash_table_remove(l->streams, s); + bool ret = t_hash_table_remove(l->streams, s); mutex_unlock(&l->lock); poller_del_item(rtpe_poller, s->sock.fd); if (ret) @@ -180,7 +183,7 @@ static void streambuf_listener_newconn(struct obj *p, socket_t *newsock, char *a obj_hold(s); mutex_lock(&listener->lock); - g_hash_table_insert(listener->streams, s, s); // hand over ref + t_hash_table_insert(listener->streams, s, s); // hand over ref mutex_unlock(&listener->lock); if (poller_add_item(rtpe_poller, &i)) @@ -192,7 +195,7 @@ static void streambuf_listener_newconn(struct obj *p, socket_t *newsock, char *a fail: mutex_lock(&listener->lock); - int ret = g_hash_table_remove(listener->streams, s); + bool ret = t_hash_table_remove(listener->streams, s); mutex_unlock(&listener->lock); if (ret) @@ -217,7 +220,7 @@ int streambuf_listener_init(struct streambuf_listener *listener, const endpoint_ ZERO(*listener); mutex_init(&listener->lock); - listener->streams = g_hash_table_new(g_direct_hash, g_direct_equal); + listener->streams = tcp_streams_ht_new(); cb = obj_alloc("streambuf_callback", sizeof(*cb), __sb_free); cb->newconn_func = newconn_func; @@ -241,8 +244,7 @@ void streambuf_listener_shutdown(struct streambuf_listener *listener) { return; poller_del_item(rtpe_poller, listener->listener.fd); close_socket(&listener->listener); - if (listener->streams) - g_hash_table_destroy(listener->streams); + t_hash_table_destroy_ptr(&listener->streams); } void streambuf_stream_close(struct streambuf_stream *s) { diff --git a/include/tcp_listener.h b/include/tcp_listener.h index 96e1c271f..a89c653cc 100644 --- a/include/tcp_listener.h +++ b/include/tcp_listener.h @@ -4,19 +4,23 @@ #include "socket.h" #include "obj.h" #include "helpers.h" +#include "containers.h" struct obj; struct streambuf_callback; struct streambuf_stream; +TYPED_GHASHTABLE_PROTO(tcp_streams_ht, struct streambuf_stream, struct streambuf_stream) + + typedef void (*tcp_listener_callback_t)(struct obj *p, socket_t *sock, char *addr, socket_t *); typedef void (*streambuf_callback_t)(struct streambuf_stream *); struct streambuf_listener { socket_t listener; mutex_t lock; - GHashTable *streams; + tcp_streams_ht streams; }; struct streambuf_stream { struct obj obj;