src: rename 'reflock-tree' to 'thread-safe-tree'
This commit is contained in:
parent
1714c32f13
commit
578f056670
31
src/api.c
31
src/api.c
@ -5,19 +5,18 @@
|
|||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "port.h"
|
#include "port.h"
|
||||||
#include "reflock-tree.h"
|
#include "thread-safe-tree.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
|
||||||
static reflock_tree_t _epoll_handle_tree;
|
static ts_tree_t _epoll_handle_tree;
|
||||||
|
|
||||||
static inline ep_port_t* _handle_tree_node_to_port(
|
static inline ep_port_t* _handle_tree_node_to_port(ts_tree_node_t* tree_node) {
|
||||||
reflock_tree_node_t* tree_node) {
|
|
||||||
return container_of(tree_node, ep_port_t, handle_tree_node);
|
return container_of(tree_node, ep_port_t, handle_tree_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
int api_global_init(void) {
|
int api_global_init(void) {
|
||||||
reflock_tree_init(&_epoll_handle_tree);
|
ts_tree_init(&_epoll_handle_tree);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,7 +31,7 @@ static HANDLE _epoll_create(void) {
|
|||||||
if (port_info == NULL)
|
if (port_info == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (reflock_tree_add(&_epoll_handle_tree,
|
if (ts_tree_add(&_epoll_handle_tree,
|
||||||
&port_info->handle_tree_node,
|
&port_info->handle_tree_node,
|
||||||
(uintptr_t) ephnd) < 0) {
|
(uintptr_t) ephnd) < 0) {
|
||||||
/* This should never happen. */
|
/* This should never happen. */
|
||||||
@ -58,13 +57,13 @@ HANDLE epoll_create1(int flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int epoll_close(HANDLE ephnd) {
|
int epoll_close(HANDLE ephnd) {
|
||||||
reflock_tree_node_t* tree_node;
|
ts_tree_node_t* tree_node;
|
||||||
ep_port_t* port_info;
|
ep_port_t* port_info;
|
||||||
|
|
||||||
if (init() < 0)
|
if (init() < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
tree_node = reflock_tree_del_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
tree_node = ts_tree_del_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
||||||
if (tree_node == NULL) {
|
if (tree_node == NULL) {
|
||||||
err_set_win_error(ERROR_INVALID_PARAMETER);
|
err_set_win_error(ERROR_INVALID_PARAMETER);
|
||||||
goto err;
|
goto err;
|
||||||
@ -73,7 +72,7 @@ int epoll_close(HANDLE ephnd) {
|
|||||||
port_info = _handle_tree_node_to_port(tree_node);
|
port_info = _handle_tree_node_to_port(tree_node);
|
||||||
ep_port_close(port_info);
|
ep_port_close(port_info);
|
||||||
|
|
||||||
reflock_tree_node_unref_and_destroy(tree_node);
|
ts_tree_node_unref_and_destroy(tree_node);
|
||||||
|
|
||||||
return ep_port_delete(port_info);
|
return ep_port_delete(port_info);
|
||||||
|
|
||||||
@ -83,15 +82,14 @@ err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int epoll_ctl(HANDLE ephnd, int op, SOCKET sock, struct epoll_event* ev) {
|
int epoll_ctl(HANDLE ephnd, int op, SOCKET sock, struct epoll_event* ev) {
|
||||||
reflock_tree_node_t* tree_node;
|
ts_tree_node_t* tree_node;
|
||||||
ep_port_t* port_info;
|
ep_port_t* port_info;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (init() < 0)
|
if (init() < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
tree_node =
|
tree_node = ts_tree_find_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
||||||
reflock_tree_find_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
|
||||||
if (tree_node == NULL) {
|
if (tree_node == NULL) {
|
||||||
err_set_win_error(ERROR_INVALID_PARAMETER);
|
err_set_win_error(ERROR_INVALID_PARAMETER);
|
||||||
goto err;
|
goto err;
|
||||||
@ -100,7 +98,7 @@ int epoll_ctl(HANDLE ephnd, int op, SOCKET sock, struct epoll_event* ev) {
|
|||||||
port_info = _handle_tree_node_to_port(tree_node);
|
port_info = _handle_tree_node_to_port(tree_node);
|
||||||
r = ep_port_ctl(port_info, op, sock, ev);
|
r = ep_port_ctl(port_info, op, sock, ev);
|
||||||
|
|
||||||
reflock_tree_node_unref(tree_node);
|
ts_tree_node_unref(tree_node);
|
||||||
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto err;
|
goto err;
|
||||||
@ -119,7 +117,7 @@ int epoll_wait(HANDLE ephnd,
|
|||||||
struct epoll_event* events,
|
struct epoll_event* events,
|
||||||
int maxevents,
|
int maxevents,
|
||||||
int timeout) {
|
int timeout) {
|
||||||
reflock_tree_node_t* tree_node;
|
ts_tree_node_t* tree_node;
|
||||||
ep_port_t* port_info;
|
ep_port_t* port_info;
|
||||||
int num_events;
|
int num_events;
|
||||||
|
|
||||||
@ -129,8 +127,7 @@ int epoll_wait(HANDLE ephnd,
|
|||||||
if (init() < 0)
|
if (init() < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
tree_node =
|
tree_node = ts_tree_find_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
||||||
reflock_tree_find_and_ref(&_epoll_handle_tree, (uintptr_t) ephnd);
|
|
||||||
if (tree_node == NULL) {
|
if (tree_node == NULL) {
|
||||||
err_set_win_error(ERROR_INVALID_PARAMETER);
|
err_set_win_error(ERROR_INVALID_PARAMETER);
|
||||||
goto err;
|
goto err;
|
||||||
@ -139,7 +136,7 @@ int epoll_wait(HANDLE ephnd,
|
|||||||
port_info = _handle_tree_node_to_port(tree_node);
|
port_info = _handle_tree_node_to_port(tree_node);
|
||||||
num_events = ep_port_wait(port_info, events, maxevents, timeout);
|
num_events = ep_port_wait(port_info, events, maxevents, timeout);
|
||||||
|
|
||||||
reflock_tree_node_unref(tree_node);
|
ts_tree_node_unref(tree_node);
|
||||||
|
|
||||||
if (num_events < 0)
|
if (num_events < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
#include "port.h"
|
#include "port.h"
|
||||||
#include "queue.h"
|
#include "queue.h"
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
#include "thread-safe-tree.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "wepoll.h"
|
#include "wepoll.h"
|
||||||
@ -54,7 +55,7 @@ ep_port_t* ep_port_new(HANDLE* iocp_out) {
|
|||||||
queue_init(&port_info->sock_update_queue);
|
queue_init(&port_info->sock_update_queue);
|
||||||
queue_init(&port_info->sock_deleted_queue);
|
queue_init(&port_info->sock_deleted_queue);
|
||||||
queue_init(&port_info->poll_group_queue);
|
queue_init(&port_info->poll_group_queue);
|
||||||
reflock_tree_node_init(&port_info->handle_tree_node);
|
ts_tree_node_init(&port_info->handle_tree_node);
|
||||||
InitializeCriticalSection(&port_info->lock);
|
InitializeCriticalSection(&port_info->lock);
|
||||||
|
|
||||||
*iocp_out = iocp;
|
*iocp_out = iocp;
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "poll-group.h"
|
#include "poll-group.h"
|
||||||
#include "queue.h"
|
#include "queue.h"
|
||||||
#include "reflock-tree.h"
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
#include "thread-safe-tree.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
@ -20,7 +20,7 @@ typedef struct ep_port {
|
|||||||
queue_t sock_update_queue;
|
queue_t sock_update_queue;
|
||||||
queue_t sock_deleted_queue;
|
queue_t sock_deleted_queue;
|
||||||
queue_t poll_group_queue;
|
queue_t poll_group_queue;
|
||||||
reflock_tree_node_t handle_tree_node;
|
ts_tree_node_t handle_tree_node;
|
||||||
CRITICAL_SECTION lock;
|
CRITICAL_SECTION lock;
|
||||||
size_t active_poll_count;
|
size_t active_poll_count;
|
||||||
} ep_port_t;
|
} ep_port_t;
|
||||||
|
|||||||
@ -1,74 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "reflock-tree.h"
|
|
||||||
#include "reflock.h"
|
|
||||||
#include "tree.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "win.h"
|
|
||||||
|
|
||||||
void reflock_tree_init(reflock_tree_t* rlt) {
|
|
||||||
tree_init(&rlt->tree);
|
|
||||||
InitializeSRWLock(&rlt->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reflock_tree_node_init(reflock_tree_node_t* node) {
|
|
||||||
tree_node_init(&node->tree_node);
|
|
||||||
reflock_init(&node->reflock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int reflock_tree_add(reflock_tree_t* rlt,
|
|
||||||
reflock_tree_node_t* node,
|
|
||||||
uintptr_t key) {
|
|
||||||
int r;
|
|
||||||
|
|
||||||
AcquireSRWLockExclusive(&rlt->lock);
|
|
||||||
r = tree_add(&rlt->tree, &node->tree_node, key);
|
|
||||||
ReleaseSRWLockExclusive(&rlt->lock);
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
reflock_tree_node_t* reflock_tree_del_and_ref(reflock_tree_t* rlt,
|
|
||||||
uintptr_t key) {
|
|
||||||
tree_node_t* tree_node;
|
|
||||||
reflock_tree_node_t* rlt_node;
|
|
||||||
|
|
||||||
AcquireSRWLockExclusive(&rlt->lock);
|
|
||||||
|
|
||||||
tree_node = tree_find(&rlt->tree, key);
|
|
||||||
rlt_node = safe_container_of(tree_node, reflock_tree_node_t, tree_node);
|
|
||||||
|
|
||||||
if (rlt_node != NULL) {
|
|
||||||
tree_del(&rlt->tree, tree_node);
|
|
||||||
reflock_ref(&rlt_node->reflock);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseSRWLockExclusive(&rlt->lock);
|
|
||||||
|
|
||||||
return rlt_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
reflock_tree_node_t* reflock_tree_find_and_ref(reflock_tree_t* rlt,
|
|
||||||
uintptr_t key) {
|
|
||||||
tree_node_t* tree_node;
|
|
||||||
reflock_tree_node_t* rlt_node;
|
|
||||||
|
|
||||||
AcquireSRWLockShared(&rlt->lock);
|
|
||||||
|
|
||||||
tree_node = tree_find(&rlt->tree, key);
|
|
||||||
rlt_node = safe_container_of(tree_node, reflock_tree_node_t, tree_node);
|
|
||||||
if (rlt_node != NULL)
|
|
||||||
reflock_ref(&rlt_node->reflock);
|
|
||||||
|
|
||||||
ReleaseSRWLockShared(&rlt->lock);
|
|
||||||
|
|
||||||
return rlt_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reflock_tree_node_unref(reflock_tree_node_t* node) {
|
|
||||||
reflock_unref(&node->reflock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reflock_tree_node_unref_and_destroy(reflock_tree_node_t* node) {
|
|
||||||
reflock_unref_and_destroy(&node->reflock);
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
#ifndef WEPOLL_REFLOCK_TREE_H_
|
|
||||||
#define WEPOLL_REFLOCK_TREE_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
#include "reflock.h"
|
|
||||||
#include "tree.h"
|
|
||||||
#include "win.h"
|
|
||||||
|
|
||||||
typedef struct reflock_tree {
|
|
||||||
tree_t tree;
|
|
||||||
SRWLOCK lock;
|
|
||||||
} reflock_tree_t;
|
|
||||||
|
|
||||||
typedef struct reflock_tree_node {
|
|
||||||
tree_node_t tree_node;
|
|
||||||
reflock_t reflock;
|
|
||||||
} reflock_tree_node_t;
|
|
||||||
|
|
||||||
WEPOLL_INTERNAL void reflock_tree_init(reflock_tree_t* rtl);
|
|
||||||
WEPOLL_INTERNAL void reflock_tree_node_init(reflock_tree_node_t* node);
|
|
||||||
|
|
||||||
WEPOLL_INTERNAL int reflock_tree_add(reflock_tree_t* rlt,
|
|
||||||
reflock_tree_node_t* node,
|
|
||||||
uintptr_t key);
|
|
||||||
|
|
||||||
WEPOLL_INTERNAL reflock_tree_node_t* reflock_tree_del_and_ref(
|
|
||||||
reflock_tree_t* rlt, uintptr_t key);
|
|
||||||
WEPOLL_INTERNAL reflock_tree_node_t* reflock_tree_find_and_ref(
|
|
||||||
reflock_tree_t* rlt, uintptr_t key);
|
|
||||||
|
|
||||||
WEPOLL_INTERNAL void reflock_tree_node_unref(reflock_tree_node_t* node);
|
|
||||||
WEPOLL_INTERNAL void reflock_tree_node_unref_and_destroy(
|
|
||||||
reflock_tree_node_t* node);
|
|
||||||
|
|
||||||
#endif /* REFLOCK_TREE_H_ */
|
|
||||||
70
src/thread-safe-tree.c
Normal file
70
src/thread-safe-tree.c
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "reflock.h"
|
||||||
|
#include "thread-safe-tree.h"
|
||||||
|
#include "tree.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "win.h"
|
||||||
|
|
||||||
|
void ts_tree_init(ts_tree_t* ts_tree) {
|
||||||
|
tree_init(&ts_tree->tree);
|
||||||
|
InitializeSRWLock(&ts_tree->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ts_tree_node_init(ts_tree_node_t* node) {
|
||||||
|
tree_node_init(&node->tree_node);
|
||||||
|
reflock_init(&node->reflock);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ts_tree_add(ts_tree_t* ts_tree, ts_tree_node_t* node, uintptr_t key) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
AcquireSRWLockExclusive(&ts_tree->lock);
|
||||||
|
r = tree_add(&ts_tree->tree, &node->tree_node, key);
|
||||||
|
ReleaseSRWLockExclusive(&ts_tree->lock);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
ts_tree_node_t* ts_tree_del_and_ref(ts_tree_t* ts_tree, uintptr_t key) {
|
||||||
|
tree_node_t* tree_node;
|
||||||
|
ts_tree_node_t* ts_tree_node;
|
||||||
|
|
||||||
|
AcquireSRWLockExclusive(&ts_tree->lock);
|
||||||
|
|
||||||
|
tree_node = tree_find(&ts_tree->tree, key);
|
||||||
|
ts_tree_node = safe_container_of(tree_node, ts_tree_node_t, tree_node);
|
||||||
|
|
||||||
|
if (ts_tree_node != NULL) {
|
||||||
|
tree_del(&ts_tree->tree, tree_node);
|
||||||
|
reflock_ref(&ts_tree_node->reflock);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseSRWLockExclusive(&ts_tree->lock);
|
||||||
|
|
||||||
|
return ts_tree_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
ts_tree_node_t* ts_tree_find_and_ref(ts_tree_t* ts_tree, uintptr_t key) {
|
||||||
|
tree_node_t* tree_node;
|
||||||
|
ts_tree_node_t* ts_tree_node;
|
||||||
|
|
||||||
|
AcquireSRWLockShared(&ts_tree->lock);
|
||||||
|
|
||||||
|
tree_node = tree_find(&ts_tree->tree, key);
|
||||||
|
ts_tree_node = safe_container_of(tree_node, ts_tree_node_t, tree_node);
|
||||||
|
if (ts_tree_node != NULL)
|
||||||
|
reflock_ref(&ts_tree_node->reflock);
|
||||||
|
|
||||||
|
ReleaseSRWLockShared(&ts_tree->lock);
|
||||||
|
|
||||||
|
return ts_tree_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ts_tree_node_unref(ts_tree_node_t* node) {
|
||||||
|
reflock_unref(&node->reflock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ts_tree_node_unref_and_destroy(ts_tree_node_t* node) {
|
||||||
|
reflock_unref_and_destroy(&node->reflock);
|
||||||
|
}
|
||||||
36
src/thread-safe-tree.h
Normal file
36
src/thread-safe-tree.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef WEPOLL_THREAD_SAFE_TREE_H_
|
||||||
|
#define WEPOLL_THREAD_SAFE_TREE_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
#include "reflock.h"
|
||||||
|
#include "tree.h"
|
||||||
|
#include "win.h"
|
||||||
|
|
||||||
|
typedef struct ts_tree {
|
||||||
|
tree_t tree;
|
||||||
|
SRWLOCK lock;
|
||||||
|
} ts_tree_t;
|
||||||
|
|
||||||
|
typedef struct ts_tree_node {
|
||||||
|
tree_node_t tree_node;
|
||||||
|
reflock_t reflock;
|
||||||
|
} ts_tree_node_t;
|
||||||
|
|
||||||
|
WEPOLL_INTERNAL void ts_tree_init(ts_tree_t* rtl);
|
||||||
|
WEPOLL_INTERNAL void ts_tree_node_init(ts_tree_node_t* node);
|
||||||
|
|
||||||
|
WEPOLL_INTERNAL int ts_tree_add(ts_tree_t* ts_tree,
|
||||||
|
ts_tree_node_t* node,
|
||||||
|
uintptr_t key);
|
||||||
|
|
||||||
|
WEPOLL_INTERNAL ts_tree_node_t* ts_tree_del_and_ref(ts_tree_t* ts_tree,
|
||||||
|
uintptr_t key);
|
||||||
|
WEPOLL_INTERNAL ts_tree_node_t* ts_tree_find_and_ref(ts_tree_t* ts_tree,
|
||||||
|
uintptr_t key);
|
||||||
|
|
||||||
|
WEPOLL_INTERNAL void ts_tree_node_unref(ts_tree_node_t* node);
|
||||||
|
WEPOLL_INTERNAL void ts_tree_node_unref_and_destroy(ts_tree_node_t* node);
|
||||||
|
|
||||||
|
#endif /* WEPOLL_THREAD_SAFE_TREE_H_ */
|
||||||
Loading…
x
Reference in New Issue
Block a user