From cf4530307fc30b9eaa3f86519133b0356eb798c1 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Fri, 17 May 2019 13:32:01 -0700 Subject: [PATCH] port: make the definition of 'struct port_state' private --- src/api.c | 17 ++++++----------- src/poll-group.c | 21 +++++++++++++-------- src/port.c | 28 ++++++++++++++++++++++++++++ src/port.h | 19 ++++++++----------- 4 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/api.c b/src/api.c index 10cb3ea..7482f5e 100644 --- a/src/api.c +++ b/src/api.c @@ -11,11 +11,6 @@ static ts_tree_t epoll__handle_tree; -static inline port_state_t* epoll__handle_tree_node_to_port( - ts_tree_node_t* tree_node) { - return container_of(tree_node, port_state_t, handle_tree_node); -} - int epoll_global_init(void) { ts_tree_init(&epoll__handle_tree); return 0; @@ -24,6 +19,7 @@ int epoll_global_init(void) { static HANDLE epoll__create(void) { port_state_t* port_state; HANDLE ephnd; + ts_tree_node_t* tree_node; if (init() < 0) return NULL; @@ -32,9 +28,8 @@ static HANDLE epoll__create(void) { if (port_state == NULL) return NULL; - if (ts_tree_add(&epoll__handle_tree, - &port_state->handle_tree_node, - (uintptr_t) ephnd) < 0) { + tree_node = port_state_to_handle_tree_node(port_state); + if (ts_tree_add(&epoll__handle_tree, tree_node, (uintptr_t) ephnd) < 0) { /* This should never happen. */ port_delete(port_state); return_set_error(NULL, ERROR_ALREADY_EXISTS); @@ -70,7 +65,7 @@ int epoll_close(HANDLE ephnd) { goto err; } - port_state = epoll__handle_tree_node_to_port(tree_node); + port_state = port_state_from_handle_tree_node(tree_node); port_close(port_state); ts_tree_node_unref_and_destroy(tree_node); @@ -96,7 +91,7 @@ int epoll_ctl(HANDLE ephnd, int op, SOCKET sock, struct epoll_event* ev) { goto err; } - port_state = epoll__handle_tree_node_to_port(tree_node); + port_state = port_state_from_handle_tree_node(tree_node); r = port_ctl(port_state, op, sock, ev); ts_tree_node_unref(tree_node); @@ -134,7 +129,7 @@ int epoll_wait(HANDLE ephnd, goto err; } - port_state = epoll__handle_tree_node_to_port(tree_node); + port_state = port_state_from_handle_tree_node(tree_node); num_events = port_wait(port_state, events, maxevents, timeout); ts_tree_node_unref(tree_node); diff --git a/src/poll-group.c b/src/poll-group.c index 53b9ca2..bf700f4 100644 --- a/src/poll-group.c +++ b/src/poll-group.c @@ -5,6 +5,7 @@ #include "error.h" #include "poll-group.h" #include "port.h" +#include "queue.h" #include "util.h" #include "win.h" @@ -18,6 +19,9 @@ typedef struct poll_group { } poll_group_t; static poll_group_t* poll_group__new(port_state_t* port_state) { + HANDLE iocp = port_get_iocp(port_state); + queue_t* poll_group_queue = port_get_poll_group_queue(port_state); + poll_group_t* poll_group = malloc(sizeof *poll_group); if (poll_group == NULL) return_set_error(NULL, ERROR_NOT_ENOUGH_MEMORY); @@ -27,13 +31,12 @@ static poll_group_t* poll_group__new(port_state_t* port_state) { queue_node_init(&poll_group->queue_node); poll_group->port_state = port_state; - if (afd_create_helper_handle(port_state->iocp, - &poll_group->afd_helper_handle) < 0) { + if (afd_create_helper_handle(iocp, &poll_group->afd_helper_handle) < 0) { free(poll_group); return NULL; } - queue_append(&port_state->poll_group_queue, &poll_group->queue_node); + queue_append(poll_group_queue, &poll_group->queue_node); return poll_group; } @@ -54,10 +57,11 @@ HANDLE poll_group_get_afd_helper_handle(poll_group_t* poll_group) { } poll_group_t* poll_group_acquire(port_state_t* port_state) { - queue_t* queue = &port_state->poll_group_queue; + queue_t* poll_group_queue = port_get_poll_group_queue(port_state); poll_group_t* poll_group = - !queue_empty(queue) - ? container_of(queue_last(queue), poll_group_t, queue_node) + !queue_empty(poll_group_queue) + ? container_of( + queue_last(poll_group_queue), poll_group_t, queue_node) : NULL; if (poll_group == NULL || @@ -67,18 +71,19 @@ poll_group_t* poll_group_acquire(port_state_t* port_state) { return NULL; if (++poll_group->group_size == POLL_GROUP__MAX_GROUP_SIZE) - queue_move_first(&port_state->poll_group_queue, &poll_group->queue_node); + queue_move_first(poll_group_queue, &poll_group->queue_node); return poll_group; } void poll_group_release(poll_group_t* poll_group) { port_state_t* port_state = poll_group->port_state; + queue_t* poll_group_queue = port_get_poll_group_queue(port_state); poll_group->group_size--; assert(poll_group->group_size < POLL_GROUP__MAX_GROUP_SIZE); - queue_move_last(&port_state->poll_group_queue, &poll_group->queue_node); + queue_move_last(poll_group_queue, &poll_group->queue_node); /* Poll groups are currently only freed when the epoll port is closed. */ } diff --git a/src/port.c b/src/port.c index 602d813..02ed36b 100644 --- a/src/port.c +++ b/src/port.c @@ -16,6 +16,17 @@ #define PORT__MAX_ON_STACK_COMPLETIONS 256 +typedef struct port_state { + HANDLE iocp; + tree_t sock_tree; + queue_t sock_update_queue; + queue_t sock_deleted_queue; + queue_t poll_group_queue; + ts_tree_node_t handle_tree_node; + CRITICAL_SECTION lock; + size_t active_poll_count; +} port_state_t; + static port_state_t* port__alloc(void) { port_state_t* port_state = malloc(sizeof *port_state); if (port_state == NULL) @@ -393,3 +404,20 @@ void port_remove_deleted_socket(port_state_t* port_state, return; queue_remove(sock_state_to_queue_node(sock_state)); } + +HANDLE port_get_iocp(port_state_t* port_state) { + assert(port_state->iocp != NULL); + return port_state->iocp; +} + +queue_t* port_get_poll_group_queue(port_state_t* port_state) { + return &port_state->poll_group_queue; +} + +port_state_t* port_state_from_handle_tree_node(ts_tree_node_t* tree_node) { + return container_of(tree_node, port_state_t, handle_tree_node); +} + +ts_tree_node_t* port_state_to_handle_tree_node(port_state_t* port_state) { + return &port_state->handle_tree_node; +} diff --git a/src/port.h b/src/port.h index f9e5ecc..bed89b0 100644 --- a/src/port.h +++ b/src/port.h @@ -14,17 +14,6 @@ typedef struct port_state port_state_t; typedef struct sock_state sock_state_t; -typedef struct port_state { - HANDLE iocp; - tree_t sock_tree; - queue_t sock_update_queue; - queue_t sock_deleted_queue; - queue_t poll_group_queue; - ts_tree_node_t handle_tree_node; - CRITICAL_SECTION lock; - size_t active_poll_count; -} port_state_t; - WEPOLL_INTERNAL port_state_t* port_new(HANDLE* iocp_out); WEPOLL_INTERNAL int port_close(port_state_t* port_state); WEPOLL_INTERNAL int port_delete(port_state_t* port_state); @@ -57,4 +46,12 @@ WEPOLL_INTERNAL void port_add_deleted_socket(port_state_t* port_state, WEPOLL_INTERNAL void port_remove_deleted_socket(port_state_t* port_state, sock_state_t* sock_state); +WEPOLL_INTERNAL HANDLE port_get_iocp(port_state_t* port_state); +WEPOLL_INTERNAL queue_t* port_get_poll_group_queue(port_state_t* port_state); + +WEPOLL_INTERNAL port_state_t* port_state_from_handle_tree_node( + ts_tree_node_t* tree_node); +WEPOLL_INTERNAL ts_tree_node_t* port_state_to_handle_tree_node( + port_state_t* port_state); + #endif /* WEPOLL_PORT_H_ */