port: make the definition of 'struct port_state' private

This commit is contained in:
Bert Belder 2019-05-17 13:32:01 -07:00
parent 0088a1f263
commit cf4530307f
No known key found for this signature in database
GPG Key ID: 7A77887B2E2ED461
4 changed files with 55 additions and 30 deletions

View File

@ -11,11 +11,6 @@
static ts_tree_t epoll__handle_tree; 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) { int epoll_global_init(void) {
ts_tree_init(&epoll__handle_tree); ts_tree_init(&epoll__handle_tree);
return 0; return 0;
@ -24,6 +19,7 @@ int epoll_global_init(void) {
static HANDLE epoll__create(void) { static HANDLE epoll__create(void) {
port_state_t* port_state; port_state_t* port_state;
HANDLE ephnd; HANDLE ephnd;
ts_tree_node_t* tree_node;
if (init() < 0) if (init() < 0)
return NULL; return NULL;
@ -32,9 +28,8 @@ static HANDLE epoll__create(void) {
if (port_state == NULL) if (port_state == NULL)
return NULL; return NULL;
if (ts_tree_add(&epoll__handle_tree, tree_node = port_state_to_handle_tree_node(port_state);
&port_state->handle_tree_node, if (ts_tree_add(&epoll__handle_tree, tree_node, (uintptr_t) ephnd) < 0) {
(uintptr_t) ephnd) < 0) {
/* This should never happen. */ /* This should never happen. */
port_delete(port_state); port_delete(port_state);
return_set_error(NULL, ERROR_ALREADY_EXISTS); return_set_error(NULL, ERROR_ALREADY_EXISTS);
@ -70,7 +65,7 @@ int epoll_close(HANDLE ephnd) {
goto err; 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); port_close(port_state);
ts_tree_node_unref_and_destroy(tree_node); 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; 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); r = port_ctl(port_state, op, sock, ev);
ts_tree_node_unref(tree_node); ts_tree_node_unref(tree_node);
@ -134,7 +129,7 @@ int epoll_wait(HANDLE ephnd,
goto err; 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); num_events = port_wait(port_state, events, maxevents, timeout);
ts_tree_node_unref(tree_node); ts_tree_node_unref(tree_node);

View File

@ -5,6 +5,7 @@
#include "error.h" #include "error.h"
#include "poll-group.h" #include "poll-group.h"
#include "port.h" #include "port.h"
#include "queue.h"
#include "util.h" #include "util.h"
#include "win.h" #include "win.h"
@ -18,6 +19,9 @@ typedef struct poll_group {
} poll_group_t; } poll_group_t;
static poll_group_t* poll_group__new(port_state_t* port_state) { 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); poll_group_t* poll_group = malloc(sizeof *poll_group);
if (poll_group == NULL) if (poll_group == NULL)
return_set_error(NULL, ERROR_NOT_ENOUGH_MEMORY); 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); queue_node_init(&poll_group->queue_node);
poll_group->port_state = port_state; poll_group->port_state = port_state;
if (afd_create_helper_handle(port_state->iocp, if (afd_create_helper_handle(iocp, &poll_group->afd_helper_handle) < 0) {
&poll_group->afd_helper_handle) < 0) {
free(poll_group); free(poll_group);
return NULL; 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; 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) { 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 = poll_group_t* poll_group =
!queue_empty(queue) !queue_empty(poll_group_queue)
? container_of(queue_last(queue), poll_group_t, queue_node) ? container_of(
queue_last(poll_group_queue), poll_group_t, queue_node)
: NULL; : NULL;
if (poll_group == NULL || if (poll_group == NULL ||
@ -67,18 +71,19 @@ poll_group_t* poll_group_acquire(port_state_t* port_state) {
return NULL; return NULL;
if (++poll_group->group_size == POLL_GROUP__MAX_GROUP_SIZE) 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; return poll_group;
} }
void poll_group_release(poll_group_t* poll_group) { void poll_group_release(poll_group_t* poll_group) {
port_state_t* port_state = poll_group->port_state; 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--; poll_group->group_size--;
assert(poll_group->group_size < POLL_GROUP__MAX_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. */ /* Poll groups are currently only freed when the epoll port is closed. */
} }

View File

@ -16,6 +16,17 @@
#define PORT__MAX_ON_STACK_COMPLETIONS 256 #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) { static port_state_t* port__alloc(void) {
port_state_t* port_state = malloc(sizeof *port_state); port_state_t* port_state = malloc(sizeof *port_state);
if (port_state == NULL) if (port_state == NULL)
@ -393,3 +404,20 @@ void port_remove_deleted_socket(port_state_t* port_state,
return; return;
queue_remove(sock_state_to_queue_node(sock_state)); 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;
}

View File

@ -14,17 +14,6 @@
typedef struct port_state port_state_t; typedef struct port_state port_state_t;
typedef struct sock_state sock_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 port_state_t* port_new(HANDLE* iocp_out);
WEPOLL_INTERNAL int port_close(port_state_t* port_state); WEPOLL_INTERNAL int port_close(port_state_t* port_state);
WEPOLL_INTERNAL int port_delete(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, WEPOLL_INTERNAL void port_remove_deleted_socket(port_state_t* port_state,
sock_state_t* sock_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_ */ #endif /* WEPOLL_PORT_H_ */