From 8a71c0c87624e7185eb11c8dd0fef8fd4ae2484a Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Fri, 8 Nov 2019 00:04:18 +0100 Subject: [PATCH] Implement us_internal_loop_unlink --- src/context.c | 1 + src/internal/internal.h | 1 + src/loop.c | 16 ++++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/context.c b/src/context.c index b3209419..0b108197 100644 --- a/src/context.c +++ b/src/context.c @@ -107,6 +107,7 @@ void us_socket_context_free(int ssl, struct us_socket_context_t *context) { } #endif + us_internal_loop_unlink(context->loop, context); free(context); } diff --git a/src/internal/internal.h b/src/internal/internal.h index 649b3008..4e1577ad 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -50,6 +50,7 @@ void us_internal_dispatch_ready_poll(struct us_poll_t *p, int error, int events) void us_internal_timer_sweep(struct us_loop_t *loop); void us_internal_free_closed_sockets(struct us_loop_t *loop); void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *context); +void us_internal_loop_unlink(struct us_loop_t *loop, struct us_socket_context_t *context); void us_internal_loop_data_init(struct us_loop_t *loop, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop)); void us_internal_loop_data_free(struct us_loop_t *loop); diff --git a/src/loop.c b/src/loop.c index 57b33878..4fc09aa3 100644 --- a/src/loop.c +++ b/src/loop.c @@ -53,6 +53,7 @@ void us_wakeup_loop(struct us_loop_t *loop) { } void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *context) { + /* Insert this context as the head of loop */ context->next = loop->data.head; context->prev = 0; if (loop->data.head) { @@ -61,6 +62,21 @@ void us_internal_loop_link(struct us_loop_t *loop, struct us_socket_context_t *c loop->data.head = context; } +/* Unlink is called before free */ +void us_internal_loop_unlink(struct us_loop_t *loop, struct us_socket_context_t *context) { + if (loop->data.head == context) { + loop->data.head = context->next; + if (loop->data.head) { + loop->data.head->prev = 0; + } + } else { + context->prev->next = context->next; + if (context->next) { + context->next->prev = context->prev; + } + } +} + /* This functions should never run recursively */ void us_internal_timer_sweep(struct us_loop_t *loop) { struct us_internal_loop_data_t *loop_data = &loop->data;