Browse Source

MT#55283 use typed GHashTable for tcp streams

Change-Id: Ia52c5895b1174a920c0ebf5c33bd9c86df7e449f
pull/1776/head
Richard Fuchs 2 years ago
parent
commit
38d064eab6
3 changed files with 18 additions and 13 deletions
  1. +5
    -6
      daemon/control_tcp.c
  2. +8
    -6
      daemon/tcp_listener.c
  3. +5
    -1
      include/tcp_listener.h

+ 5
- 6
daemon/control_tcp.c View File

@ -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");
}


+ 8
- 6
daemon/tcp_listener.c View File

@ -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) {


+ 5
- 1
include/tcp_listener.h View File

@ -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;


Loading…
Cancel
Save