From ca79e2993b29ba0884f175fac56a59c881a3f926 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Fri, 13 Nov 2020 15:21:19 +0700 Subject: [PATCH] [-] Removed multi-thread listeners for all polls except EPOLL --- CMakeLists.txt | 2 +- dap-sdk/net/core/dap_server.c | 20 ++++++++++++++++++++ dap-sdk/net/core/dap_worker.c | 21 ++++----------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8fb39a469..fc1fe31ce6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-40") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-41") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index 504f027fc7..2443ee3ae6 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -178,6 +178,8 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16 l_callbacks.error_callback = a_callbacks->error_callback; } +// if we have poll exclusive +#if defined(DAP_EVENTS_CAPS_EPOLL) for(size_t l_worker_id = 0; l_worker_id < dap_events_worker_get_count() ; l_worker_id++){ dap_worker_t *l_w = dap_events_worker_get(l_worker_id); assert(l_w); @@ -200,6 +202,24 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16 return NULL; } } +#else + // or not + dap_worker_t *l_w = dap_events_worker_get_auto(); + assert(l_w); + dap_events_socket_t * l_es = dap_events_socket_wrap2( l_server, a_events, l_server->socket_listener, &l_callbacks); + if (l_es) { + l_server->es_listeners = dap_list_append(l_server->es_listeners, l_es); + l_es->type = l_server->type == DAP_SERVER_TCP ? DESCRIPTOR_TYPE_SOCKET_LISTENING : DESCRIPTOR_TYPE_SOCKET_UDP; + l_es->_inheritor = l_server; + pthread_mutex_lock(&l_server->started_mutex); + dap_worker_add_events_socket( l_es, l_w ); + pthread_cond_wait(&l_server->started_cond, &l_server->started_mutex); + pthread_mutex_unlock(&l_server->started_mutex); + } else{ + log_it(L_WARNING, "Can't wrap event socket for %s:%u server", a_addr, a_port); + return NULL; + } +#endif return l_server; } diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index 4686dc6b39..9300b20d8c 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -185,37 +185,24 @@ void *dap_worker_thread(void *arg) int l_sock_err = 0, l_sock_err_size = sizeof(l_sock_err); //connection already closed (EPOLLHUP - shutdown has been made in both directions) - if( l_flag_hup) { + if( l_flag_hup || l_flag_rdhup) { switch (l_cur->type ){ - case DESCRIPTOR_TYPE_SOCKET_LISTENING: + case DESCRIPTOR_TYPE_SOCKET_UDP: case DESCRIPTOR_TYPE_SOCKET: getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_sock_err, (socklen_t *)&l_sock_err_size); if (l_sock_err) { - dap_events_socket_set_readable_unsafe(l_cur, false); dap_events_socket_set_writable_unsafe(l_cur, false); l_cur->buf_out_size = 0; l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - l_flag_error = l_flag_read = l_flag_write = false; + l_flag_error = l_flag_write = false; l_cur->callbacks.error_callback(l_cur, l_sock_err); // Call callback to process error event log_it(L_INFO, "Socket shutdown (EPOLLHUP): %s", strerror(l_sock_err)); } break; - default: log_it(L_WARNING, "Unimplemented EPOLLHUP for socket type %d", l_cur->type); - } - } - - if (l_flag_rdhup ){ // Lets think thats disconnected state - switch (l_cur->type ){ - case DESCRIPTOR_TYPE_SOCKET: - case DESCRIPTOR_TYPE_SOCKET_UDP: - l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - break; - default:{ + default: if(s_debug_reactor) log_it(L_INFO,"RDHUP event on esocket %p (%d) type %d", l_cur, l_cur->socket, l_cur->type ); - } } - //l_cur->callbacks.error_callback(l_cur, l_sock_err); // Call callback to process error event } if(l_flag_nval ){ -- GitLab