From c07cc8f7cce824613ccf63f4e8a892030c85e44c Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Wed, 2 May 2018 03:00:45 +0200 Subject: [PATCH] poll-group: do away with the poll_group_allocator class --- src/poll-group.c | 60 ++++++++++++++---------------------------------- src/poll-group.h | 11 ++++----- src/port.c | 21 ++++++----------- src/port.h | 2 +- 4 files changed, 30 insertions(+), 64 deletions(-) diff --git a/src/poll-group.c b/src/poll-group.c index c6423d4..11e3ec2 100644 --- a/src/poll-group.c +++ b/src/poll-group.c @@ -9,19 +9,14 @@ static const size_t _POLL_GROUP_MAX_SIZE = 32; -typedef struct poll_group_allocator { - ep_port_t* port_info; - queue_t poll_group_queue; -} poll_group_allocator_t; - typedef struct poll_group { - poll_group_allocator_t* allocator; + ep_port_t* port_info; queue_node_t queue_node; SOCKET socket; size_t group_size; } poll_group_t; -static poll_group_t* _poll_group_new(poll_group_allocator_t* pga) { +static poll_group_t* _poll_group_new(ep_port_t* port_info) { poll_group_t* poll_group = malloc(sizeof *poll_group); if (poll_group == NULL) return_error(NULL, ERROR_NOT_ENOUGH_MEMORY); @@ -29,79 +24,58 @@ static poll_group_t* _poll_group_new(poll_group_allocator_t* pga) { memset(poll_group, 0, sizeof *poll_group); queue_node_init(&poll_group->queue_node); - poll_group->allocator = pga; + poll_group->port_info = port_info; - if (afd_create_driver_socket(pga->port_info->iocp, &poll_group->socket) < - 0) { + if (afd_create_driver_socket(port_info->iocp, &poll_group->socket) < 0) { free(poll_group); return NULL; } - queue_append(&pga->poll_group_queue, &poll_group->queue_node); + queue_append(&port_info->poll_group_queue, &poll_group->queue_node); return poll_group; } -static void _poll_group_delete(poll_group_t* poll_group) { +void poll_group_delete(poll_group_t* poll_group) { assert(poll_group->group_size == 0); closesocket(poll_group->socket); queue_remove(&poll_group->queue_node); free(poll_group); } +poll_group_t* poll_group_from_queue_node(queue_node_t* queue_node) { + return container_of(queue_node, poll_group_t, queue_node); +} + SOCKET poll_group_get_socket(poll_group_t* poll_group) { return poll_group->socket; } -poll_group_allocator_t* poll_group_allocator_new(ep_port_t* port_info) { - poll_group_allocator_t* pga = malloc(sizeof *pga); - if (pga == NULL) - return_error(NULL, ERROR_NOT_ENOUGH_MEMORY); - - queue_init(&pga->poll_group_queue); - pga->port_info = port_info; - - return pga; -} - -void poll_group_allocator_delete(poll_group_allocator_t* pga) { - queue_t* poll_group_queue = &pga->poll_group_queue; - - while (!queue_empty(poll_group_queue)) { - queue_node_t* queue_node = queue_first(poll_group_queue); - poll_group_t* poll_group = - container_of(queue_node, poll_group_t, queue_node); - _poll_group_delete(poll_group); - } - - free(pga); -} - -poll_group_t* poll_group_acquire(poll_group_allocator_t* pga) { - queue_t* queue = &pga->poll_group_queue; +poll_group_t* poll_group_acquire(ep_port_t* port_info) { + queue_t* queue = &port_info->poll_group_queue; poll_group_t* poll_group = !queue_empty(queue) ? container_of(queue_last(queue), poll_group_t, queue_node) : NULL; if (poll_group == NULL || poll_group->group_size >= _POLL_GROUP_MAX_SIZE) - poll_group = _poll_group_new(pga); + poll_group = _poll_group_new(port_info); if (poll_group == NULL) return NULL; if (++poll_group->group_size == _POLL_GROUP_MAX_SIZE) - queue_move_first(&pga->poll_group_queue, &poll_group->queue_node); + queue_move_first(&port_info->poll_group_queue, &poll_group->queue_node); return poll_group; } void poll_group_release(poll_group_t* poll_group) { - poll_group_allocator_t* pga = poll_group->allocator; + ep_port_t* port_info = poll_group->port_info; poll_group->group_size--; assert(poll_group->group_size < _POLL_GROUP_MAX_SIZE); - queue_move_last(&pga->poll_group_queue, &poll_group->queue_node); + queue_move_last(&port_info->poll_group_queue, &poll_group->queue_node); - /* TODO: free the poll_group_t* item at some point. */ + /* Poll groups are currently only freed when the epoll port is closed. */ } diff --git a/src/poll-group.h b/src/poll-group.h index 7345f32..7f64c38 100644 --- a/src/poll-group.h +++ b/src/poll-group.h @@ -7,16 +7,15 @@ #include "win.h" typedef struct ep_port ep_port_t; -typedef struct poll_group_allocator poll_group_allocator_t; typedef struct poll_group poll_group_t; -WEPOLL_INTERNAL poll_group_allocator_t* poll_group_allocator_new( - ep_port_t* port_info); -WEPOLL_INTERNAL void poll_group_allocator_delete(poll_group_allocator_t* pga); +WEPOLL_INTERNAL poll_group_t* poll_group_acquire(ep_port_t* port); +WEPOLL_INTERNAL void poll_group_release(poll_group_t* poll_group); -WEPOLL_INTERNAL poll_group_t* poll_group_acquire(poll_group_allocator_t* pga); -WEPOLL_INTERNAL void poll_group_release(poll_group_t* ds); +WEPOLL_INTERNAL void poll_group_delete(poll_group_t* poll_group); +WEPOLL_INTERNAL poll_group_t* poll_group_from_queue_node( + queue_node_t* queue_node); WEPOLL_INTERNAL SOCKET poll_group_get_socket(poll_group_t* poll_group); #endif /* WEPOLL_POLL_GROUP_H_ */ diff --git a/src/port.c b/src/port.c index c05aafe..8a20fbf 100644 --- a/src/port.c +++ b/src/port.c @@ -50,9 +50,10 @@ ep_port_t* ep_port_new(HANDLE* iocp_out) { memset(port_info, 0, sizeof *port_info); port_info->iocp = iocp; + tree_init(&port_info->sock_tree); queue_init(&port_info->sock_update_queue); queue_init(&port_info->sock_deleted_queue); - tree_init(&port_info->sock_tree); + queue_init(&port_info->poll_group_queue); reflock_tree_node_init(&port_info->handle_tree_node); InitializeCriticalSection(&port_info->lock); @@ -102,8 +103,10 @@ int ep_port_delete(ep_port_t* port_info) { ep_sock_force_delete(port_info, sock_info); } - if (port_info->poll_group_allocator != NULL) - poll_group_allocator_delete(port_info->poll_group_allocator); + while ((queue_node = queue_first(&port_info->poll_group_queue)) != NULL) { + poll_group_t* poll_group = poll_group_from_queue_node(queue_node); + poll_group_delete(poll_group); + } DeleteCriticalSection(&port_info->lock); @@ -356,18 +359,8 @@ ep_sock_t* ep_port_find_socket(ep_port_t* port_info, SOCKET socket) { return sock_info; } -static poll_group_allocator_t* _ep_port_get_poll_group_allocator( - ep_port_t* port_info) { - if (port_info->poll_group_allocator == NULL) { - port_info->poll_group_allocator = poll_group_allocator_new(port_info); - } - - return port_info->poll_group_allocator; -} - poll_group_t* ep_port_acquire_poll_group(ep_port_t* port_info) { - poll_group_allocator_t* pga = _ep_port_get_poll_group_allocator(port_info); - return poll_group_acquire(pga); + return poll_group_acquire(port_info); } void ep_port_release_poll_group(ep_port_t* port_info, diff --git a/src/port.h b/src/port.h index 4ff7c4c..78ebdb5 100644 --- a/src/port.h +++ b/src/port.h @@ -16,10 +16,10 @@ typedef struct ep_sock ep_sock_t; typedef struct ep_port { HANDLE iocp; - poll_group_allocator_t* poll_group_allocator; tree_t sock_tree; queue_t sock_update_queue; queue_t sock_deleted_queue; + queue_t poll_group_queue; reflock_tree_node_t handle_tree_node; CRITICAL_SECTION lock; size_t active_poll_count;