port: make the definition of 'struct port_state' private
This commit is contained in:
parent
0088a1f263
commit
cf4530307f
17
src/api.c
17
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);
|
||||
|
||||
@ -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. */
|
||||
}
|
||||
|
||||
28
src/port.c
28
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;
|
||||
}
|
||||
|
||||
19
src/port.h
19
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_ */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user