diff --git a/src/epoll-socket.c b/src/epoll-socket.c index 09e6918..1032045 100644 --- a/src/epoll-socket.c +++ b/src/epoll-socket.c @@ -57,7 +57,7 @@ ep_sock_t* ep_sock_new(ep_port_t* port_info) { unused(port_info); memset(sock_private, 0, sizeof *sock_private); - handle_tree_node_init(&sock_private->pub.tree_node); + tree_node_init(&sock_private->pub.tree_node); queue_node_init(&sock_private->pub.queue_node); return &sock_private->pub; @@ -303,7 +303,7 @@ int ep_sock_feed_event(ep_port_t* port_info, return ev_count; } -ep_sock_t* ep_sock_from_tree_node(handle_tree_node_t* tree_node) { +ep_sock_t* ep_sock_from_tree_node(tree_node_t* tree_node) { assert(tree_node != NULL); return container_of(tree_node, ep_sock_t, tree_node); } diff --git a/src/epoll-socket.h b/src/epoll-socket.h index e36a69a..42ad926 100644 --- a/src/epoll-socket.h +++ b/src/epoll-socket.h @@ -4,10 +4,10 @@ #include #include "epoll.h" -#include "handle-tree.h" #include "internal.h" #include "queue.h" #include "rb.h" +#include "tree.h" #include "util.h" #include "win.h" @@ -15,7 +15,7 @@ typedef struct ep_port ep_port_t; typedef struct poll_req poll_req_t; typedef struct ep_sock { - handle_tree_node_t tree_node; + tree_node_t tree_node; queue_node_t queue_node; } ep_sock_t; @@ -39,7 +39,6 @@ EPOLL_INTERNAL void ep_sock_register_poll_req(ep_port_t* port_info, EPOLL_INTERNAL void ep_sock_unregister_poll_req(ep_port_t* port_info, ep_sock_t* sock_info); -EPOLL_INTERNAL ep_sock_t* ep_sock_from_tree_node( - handle_tree_node_t* tree_node); +EPOLL_INTERNAL ep_sock_t* ep_sock_from_tree_node(tree_node_t* tree_node); #endif /* EPOLL_SOCK_DATA_H_ */ diff --git a/src/epoll.c b/src/epoll.c index 5b5c03f..6230654 100644 --- a/src/epoll.c +++ b/src/epoll.c @@ -49,10 +49,10 @@ static int _ep_ctl_add(ep_port_t* port_info, static int _ep_ctl_mod(ep_port_t* port_info, uintptr_t socket, struct epoll_event* ev) { - handle_tree_node_t* tree_node; + tree_node_t* tree_node; ep_sock_t* sock_info; - tree_node = handle_tree_find(&port_info->sock_tree, socket); + tree_node = tree_find(&port_info->sock_tree, socket); if (tree_node == NULL) return -1; @@ -65,10 +65,10 @@ static int _ep_ctl_mod(ep_port_t* port_info, } static int _ep_ctl_del(ep_port_t* port_info, uintptr_t socket) { - handle_tree_node_t* tree_node; + tree_node_t* tree_node; ep_sock_t* sock_info; - tree_node = handle_tree_find(&port_info->sock_tree, socket); + tree_node = tree_find(&port_info->sock_tree, socket); if (tree_node == NULL) return -1; @@ -232,14 +232,14 @@ epoll_t epoll_create(void) { queue_init(&port_info->update_queue); memset(&port_info->driver_sockets, 0, sizeof port_info->driver_sockets); - handle_tree_init(&port_info->sock_tree); + tree_init(&port_info->sock_tree); return (epoll_t) port_info; } int epoll_close(epoll_t port_handle) { ep_port_t* port_info; - handle_tree_node_t* tree_node; + tree_node_t* tree_node; port_info = (ep_port_t*) port_handle; @@ -281,7 +281,7 @@ int epoll_close(epoll_t port_handle) { } /* Remove all entries from the socket_state tree. */ - while ((tree_node = handle_tree_root(&port_info->sock_tree)) != NULL) { + while ((tree_node = tree_root(&port_info->sock_tree)) != NULL) { ep_sock_t* sock_info = ep_sock_from_tree_node(tree_node); ep_sock_delete(port_info, sock_info); } @@ -311,13 +311,13 @@ static int _ep_initialize(void) { } int ep_port_add_socket(ep_port_t* port_info, - handle_tree_node_t* tree_node, + tree_node_t* tree_node, SOCKET socket) { - return handle_tree_add(&port_info->sock_tree, tree_node, socket); + return tree_add(&port_info->sock_tree, tree_node, socket); } -int ep_port_del_socket(ep_port_t* port_info, handle_tree_node_t* tree_node) { - return handle_tree_del(&port_info->sock_tree, tree_node); +int ep_port_del_socket(ep_port_t* port_info, tree_node_t* tree_node) { + return tree_del(&port_info->sock_tree, tree_node); } void ep_port_add_req(ep_port_t* port_info) { diff --git a/src/handle-tree.c b/src/handle-tree.c deleted file mode 100644 index 87a66d0..0000000 --- a/src/handle-tree.c +++ /dev/null @@ -1,85 +0,0 @@ -#include - -#include "error.h" -#include "handle-tree.h" -#include "rb.h" - -static inline int _handle_tree_compare(handle_tree_node_t* a, - handle_tree_node_t* b) { - if (a->key < b->key) - return -1; - else if (a->key > b->key) - return 1; - else - return 0; -} - -RB_GENERATE_STATIC(handle_tree, handle_tree_node, node, _handle_tree_compare); - -void handle_tree_init(handle_tree_t* tree) { - RB_INIT(tree); -} - -void handle_tree_node_init(handle_tree_node_t* node) { - memset(node, 0, sizeof *node); -} - -int handle_tree_add(handle_tree_t* tree, - handle_tree_node_t* node, - uintptr_t key) { - handle_tree_node_t* existing_node; - - if (key == 0) - return_error(-1, ERROR_INVALID_PARAMETER); - if (node->key != 0) - return_error(-1, ERROR_ALREADY_EXISTS); - - node->key = key; - existing_node = RB_INSERT(handle_tree, tree, node); - - if (existing_node != NULL) { - node->key = 0; - return_error(-1, ERROR_ALREADY_EXISTS); - } - - return 0; -} - -int handle_tree_del(handle_tree_t* tree, handle_tree_node_t* node) { - handle_tree_node_t* removed_node; - - if (node->key == 0) - return_error(-1, ERROR_NOT_FOUND); - - removed_node = RB_REMOVE(handle_tree, tree, node); - - if (removed_node == NULL) - return_error(-1, ERROR_NOT_FOUND); - else - assert(removed_node == node); - - node->key = 0; - - return 0; -} - -handle_tree_node_t* handle_tree_find(handle_tree_t* tree, uintptr_t key) { - handle_tree_node_t* node; - handle_tree_node_t lookup; - - if (key == 0) - return_error(NULL, ERROR_INVALID_PARAMETER); - - memset(&lookup, 0, sizeof lookup); - lookup.key = key; - - node = RB_FIND(handle_tree, tree, &lookup); - if (node == NULL) - return_error(NULL, ERROR_NOT_FOUND); - - return node; -} - -handle_tree_node_t* handle_tree_root(handle_tree_t* tree) { - return RB_ROOT(tree); -} diff --git a/src/handle-tree.h b/src/handle-tree.h deleted file mode 100644 index 19cd1c3..0000000 --- a/src/handle-tree.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef EPOLL_HANDLE_TREE_H_ -#define EPOLL_HANDLE_TREE_H_ - -#include "internal.h" -#include "rb.h" - -typedef RB_HEAD(handle_tree, handle_tree_node) handle_tree_t; - -typedef struct handle_tree_node { - RB_ENTRY(handle_tree_node) node; - uintptr_t key; -} handle_tree_node_t; - -EPOLL_INTERNAL void handle_tree_init(handle_tree_t* tree); -EPOLL_INTERNAL void handle_tree_node_init(handle_tree_node_t* node); - -EPOLL_INTERNAL int handle_tree_add(handle_tree_t* tree, - handle_tree_node_t* node, - uintptr_t key); -EPOLL_INTERNAL int handle_tree_del(handle_tree_t* tree, - handle_tree_node_t* node); - -EPOLL_INTERNAL handle_tree_node_t* handle_tree_find(handle_tree_t* tree, - uintptr_t key); -EPOLL_INTERNAL handle_tree_node_t* handle_tree_root(handle_tree_t* tree); - -#endif /* EPOLL_HANDLE_TREE_H_ */ diff --git a/src/port.h b/src/port.h index 12c6dc3..8ca6641 100644 --- a/src/port.h +++ b/src/port.h @@ -3,10 +3,10 @@ #include "afd.h" #include "epoll-socket.h" -#include "handle-tree.h" #include "internal.h" #include "queue.h" #include "rb.h" +#include "tree.h" #include "util.h" #include "win.h" @@ -16,7 +16,7 @@ typedef struct ep_sock ep_sock_t; typedef struct ep_port { HANDLE iocp; SOCKET driver_sockets[array_count(AFD_PROVIDER_GUID_LIST)]; - handle_tree_t sock_tree; + tree_t sock_tree; queue_t update_queue; size_t poll_req_count; } ep_port_t; @@ -25,10 +25,10 @@ EPOLL_INTERNAL SOCKET ep_port_get_driver_socket(ep_port_t* port_info, SOCKET socket); EPOLL_INTERNAL int ep_port_add_socket(ep_port_t* port_info, - handle_tree_node_t* tree_node, + tree_node_t* tree_node, SOCKET socket); EPOLL_INTERNAL int ep_port_del_socket(ep_port_t* port_info, - handle_tree_node_t* tree_node); + tree_node_t* tree_node); EPOLL_INTERNAL void ep_port_add_req(ep_port_t* port_info); EPOLL_INTERNAL void ep_port_del_req(ep_port_t* port_info); diff --git a/src/tree.c b/src/tree.c new file mode 100644 index 0000000..b6a3e15 --- /dev/null +++ b/src/tree.c @@ -0,0 +1,82 @@ +#include + +#include "error.h" +#include "rb.h" +#include "tree.h" + +static inline int _tree_compare(tree_node_t* a, tree_node_t* b) { + if (a->key < b->key) + return -1; + else if (a->key > b->key) + return 1; + else + return 0; +} + +RB_GENERATE_STATIC(tree, tree_node, node, _tree_compare); + +void tree_init(tree_t* tree) { + RB_INIT(tree); +} + +void tree_node_init(tree_node_t* node) { + memset(node, 0, sizeof *node); +} + +int tree_add(tree_t* tree, tree_node_t* node, uintptr_t key) { + tree_node_t* existing_node; + + if (key == 0) + return_error(-1, ERROR_INVALID_PARAMETER); + if (node->key != 0) + return_error(-1, ERROR_ALREADY_EXISTS); + + node->key = key; + existing_node = RB_INSERT(tree, tree, node); + + if (existing_node != NULL) { + node->key = 0; + return_error(-1, ERROR_ALREADY_EXISTS); + } + + return 0; +} + +int tree_del(tree_t* tree, tree_node_t* node) { + tree_node_t* removed_node; + + if (node->key == 0) + return_error(-1, ERROR_NOT_FOUND); + + removed_node = RB_REMOVE(tree, tree, node); + + if (removed_node == NULL) + return_error(-1, ERROR_NOT_FOUND); + else + assert(removed_node == node); + + node->key = 0; + + return 0; +} + +tree_node_t* tree_find(tree_t* tree, uintptr_t key) { + tree_node_t* node; + tree_node_t lookup; + + if (key == 0) + return_error(NULL, ERROR_INVALID_PARAMETER); + + memset(&lookup, 0, sizeof lookup); + lookup.key = key; + + node = RB_FIND(tree, tree, &lookup); + if (node == NULL) + return_error(NULL, ERROR_NOT_FOUND); + + return node; +} + +tree_node_t* tree_root(tree_t* tree) { + return RB_ROOT(tree); +} diff --git a/src/tree.h b/src/tree.h new file mode 100644 index 0000000..27e3122 --- /dev/null +++ b/src/tree.h @@ -0,0 +1,23 @@ +#ifndef EPOLL_HANDLE_TREE_H_ +#define EPOLL_HANDLE_TREE_H_ + +#include "internal.h" +#include "rb.h" + +typedef RB_HEAD(tree, tree_node) tree_t; + +typedef struct tree_node { + RB_ENTRY(tree_node) node; + uintptr_t key; +} tree_node_t; + +EPOLL_INTERNAL void tree_init(tree_t* tree); +EPOLL_INTERNAL void tree_node_init(tree_node_t* node); + +EPOLL_INTERNAL int tree_add(tree_t* tree, tree_node_t* node, uintptr_t key); +EPOLL_INTERNAL int tree_del(tree_t* tree, tree_node_t* node); + +EPOLL_INTERNAL tree_node_t* tree_find(tree_t* tree, uintptr_t key); +EPOLL_INTERNAL tree_node_t* tree_root(tree_t* tree); + +#endif /* EPOLL_HANDLE_TREE_H_ */