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 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);
|
||||||
|
|||||||
@ -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. */
|
||||||
}
|
}
|
||||||
|
|||||||
28
src/port.c
28
src/port.c
@ -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;
|
||||||
|
}
|
||||||
|
|||||||
19
src/port.h
19
src/port.h
@ -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_ */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user