From 729fa3c7338c4068924fb8e03286b4a7a8eeeed8 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Mon, 25 Sep 2017 19:32:13 +0200 Subject: [PATCH] port: move IOCP port creation to ep_port_new() --- src/epoll.c | 16 +++++----------- src/port.c | 15 +++++++++++++-- src/port.h | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/epoll.c b/src/epoll.c index adc3bb3..fd86132 100644 --- a/src/epoll.c +++ b/src/epoll.c @@ -24,29 +24,23 @@ int epoll_global_init(void) { HANDLE epoll_create(void) { ep_port_t* port_info; - HANDLE iocp; + HANDLE ephnd; if (init() < 0) return NULL; - iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); - if (iocp == INVALID_HANDLE_VALUE) - return_error(NULL); - - port_info = ep_port_new(iocp); - if (port_info == NULL) { - CloseHandle(iocp); + port_info = ep_port_new(&ephnd); + if (port_info == NULL) return NULL; - } if (reflock_tree_add(&_epoll_handle_tree, &port_info->handle_tree_node, - (uintptr_t) iocp) < 0) { + (uintptr_t) ephnd) < 0) { ep_port_delete(port_info); return_error(INVALID_HANDLE_VALUE, ERROR_ALREADY_EXISTS); } - return iocp; + return ephnd; } int epoll_close(HANDLE ephnd) { diff --git a/src/port.c b/src/port.c index 82f9bae..62fe48a 100644 --- a/src/port.c +++ b/src/port.c @@ -27,12 +27,17 @@ static void _ep_port_free(ep_port_t* port) { free(port); } -ep_port_t* ep_port_new(HANDLE iocp) { +ep_port_t* ep_port_new(HANDLE* iocp_out) { ep_port_t* port_info; + HANDLE iocp; port_info = _ep_port_alloc(); if (port_info == NULL) - return NULL; + goto err1; + + iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); + if (iocp == INVALID_HANDLE_VALUE) + goto err2; memset(port_info, 0, sizeof *port_info); @@ -42,7 +47,13 @@ ep_port_t* ep_port_new(HANDLE iocp) { reflock_tree_node_init(&port_info->handle_tree_node); InitializeCriticalSection(&port_info->lock); + *iocp_out = iocp; return port_info; + +err2: + _ep_port_free(port_info); +err1: + return NULL; } static int _ep_port_close_iocp(ep_port_t* port_info) { diff --git a/src/port.h b/src/port.h index ae15edd..a60605f 100644 --- a/src/port.h +++ b/src/port.h @@ -26,7 +26,7 @@ typedef struct ep_port { CRITICAL_SECTION lock; } ep_port_t; -EPOLL_INTERNAL ep_port_t* ep_port_new(HANDLE iocp); +EPOLL_INTERNAL ep_port_t* ep_port_new(HANDLE* iocp_out); EPOLL_INTERNAL int ep_port_close(ep_port_t* port_info); EPOLL_INTERNAL int ep_port_delete(ep_port_t* port_info);