diff --git a/include/dap_events.h b/include/dap_events.h index 1b2d52ae807b080dba10cb2ad9a65c9959e3d069..8f6f407d0bbbfb5c6566d5065ecda214d1ab0bf7 100755 --- a/include/dap_events.h +++ b/include/dap_events.h @@ -63,7 +63,7 @@ typedef struct dap_events { typedef struct dap_worker { uint32_t event_sockets_count; - uint32_t event_to_kill_count; + //uint32_t event_to_kill_count; EPOLL_HANDLE epoll_fd; uint32_t number_thread; @@ -78,10 +78,6 @@ void dap_events_deinit( ); // Deinit server module void dap_events_thread_wake_up( dap_thread_t *th ); dap_events_t* dap_events_new( ); void dap_events_delete( dap_events_t * sh ); -//void dap_events_socket_remove_and_delete( dap_events_socket_t* a_es ); -void dap_events_socket_remove_and_delete(dap_events_socket_t* a_es, bool preserve_inheritor ); - -void dap_events_kill_socket( dap_events_socket_t *a_es ); int32_t dap_events_start( dap_events_t *sh ); int32_t dap_events_wait( dap_events_t *sh ); diff --git a/include/dap_events_socket.h b/include/dap_events_socket.h index 1e87beebbdc30a0dd9aefeab6eb967b006e7f0f3..42efc75566d15aec741c436f040659b883963b74 100755 --- a/include/dap_events_socket.h +++ b/include/dap_events_socket.h @@ -154,7 +154,12 @@ size_t dap_events_socket_write(dap_events_socket_t *sc, const void * data, size_ size_t dap_events_socket_write_f(dap_events_socket_t *sc, const char * format,...); size_t dap_events_socket_read(dap_events_socket_t *sc, void * data, size_t data_size); +void dap_events_socket_remove( dap_events_socket_t *a_es); void dap_events_socket_delete(dap_events_socket_t *sc,bool preserve_inheritor); // Removes the client from the list +void dap_events_socket_remove_and_delete(dap_events_socket_t* a_es, bool preserve_inheritor ); +int dap_events_socket_kill_socket( dap_events_socket_t *a_es ); + + void dap_events_socket_shrink_buf_in(dap_events_socket_t * cl, size_t shrink_size); diff --git a/src/dap_events.c b/src/dap_events.c index 6fbb3be015d76d091627ee87c1fbcc155209c42e..a2b77eda2071900fd28d201b858e4475369eb075 100755 --- a/src/dap_events.c +++ b/src/dap_events.c @@ -66,6 +66,7 @@ #include <sched.h> #include "dap_common.h" +#include "dap_server.h" #include "dap_events.h" #define DAP_MAX_EPOLL_EVENTS 8192 @@ -193,7 +194,7 @@ void dap_events_delete( dap_events_t *a_events ) if ( a_events ) { HASH_ITER( hh, a_events->sockets,cur, tmp ) { - dap_events_socket_delete( cur, false ); + dap_events_socket_delete( cur, true ); } if ( a_events->_inheritor ) @@ -206,33 +207,6 @@ void dap_events_delete( dap_events_t *a_events ) } } -void dap_events_kill_socket( dap_events_socket_t *a_es ) -{ - if ( !a_es ) { - log_it( L_ERROR, "dap_events_kill_socket( NULL )" ); - return; - } - - uint32_t tn = a_es->dap_worker->number_thread; - - dap_worker_t *w = a_es->dap_worker; - dap_events_t *d_ev = w->events; - - pthread_mutex_lock( &w->locker_on_count ); - if ( a_es->kill_signal ) { - pthread_mutex_unlock( &w->locker_on_count ); - return; - } - - log_it( L_DEBUG, "KILL %u socket! [ thread %u ]", a_es->socket, tn ); - - a_es->kill_signal = true; - DL_LIST_ADD_NODE_HEAD( d_ev->to_kill_sockets, a_es, kprev, knext, w->event_to_kill_count ); - - pthread_mutex_unlock( &w->locker_on_count ); -} - - /** * @brief s_socket_info_all_check_activity * @param n_thread @@ -256,7 +230,7 @@ static void s_socket_all_check_activity( dap_worker_t *dap_worker, dap_events_t dap_worker->event_sockets_count --; DL_DELETE( d_ev->dlsockets, a_es ); - dap_events_socket_delete( a_es, false ); + dap_events_socket_delete( a_es, true ); } } pthread_mutex_unlock( &dap_worker->locker_on_count ); @@ -268,30 +242,30 @@ static void s_socket_all_check_activity( dap_worker_t *dap_worker, dap_events_t * @param arg * @return */ -static void *thread_worker_function( void *arg ) +static void *thread_worker_function(void *arg) { - dap_events_socket_t *cur, *tmp; - dap_worker_t *w = (dap_worker_t *)arg; - time_t next_time_timeout_check = time( NULL ) + s_connection_timeout / 2; - uint32_t tn = w->number_thread; + dap_events_socket_t *cur; + dap_worker_t *w = (dap_worker_t *) arg; + time_t next_time_timeout_check = time( NULL) + s_connection_timeout / 2; + uint32_t tn = w->number_thread; #ifndef _WIN32 #ifndef NO_POSIX_SHED - cpu_set_t mask; - CPU_ZERO( &mask ); - CPU_SET( tn, &mask ); + cpu_set_t mask; + CPU_ZERO(&mask); + CPU_SET(tn, &mask); - int err; + int err; #ifndef __ANDROID__ - err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &mask); + err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &mask); #else err = sched_setaffinity(pthread_self(), sizeof(cpu_set_t), &mask); #endif - if (err) - { - log_it(L_CRITICAL, "Error pthread_setaffinity_np() You really have %d or more core in CPU?", *(int*)arg); - abort(); - } + if(err) + { + log_it(L_CRITICAL, "Error pthread_setaffinity_np() You really have %d or more core in CPU?", *(int* )arg); + abort(); + } #endif #else @@ -301,180 +275,185 @@ static void *thread_worker_function( void *arg ) } #endif - log_it(L_INFO, "Worker %d started, epoll fd %d", w->number_thread, w->epoll_fd); + log_it(L_INFO, "Worker %d started, epoll fd %d", w->number_thread, w->epoll_fd); - struct epoll_event *events = &g_epoll_events[ DAP_MAX_EPOLL_EVENTS * tn ]; + struct epoll_event *events = &g_epoll_events[ DAP_MAX_EPOLL_EVENTS * tn]; // memset( &ev, 0, sizeof(ev) ); // memset( &events, 0, sizeof(events) ); - size_t total_sent; int bytes_sent; + size_t total_sent; + int bytes_sent; - while( 1 ) { + while(1) { - int selected_sockets = epoll_wait( w->epoll_fd, events, DAP_MAX_EPOLL_EVENTS, 1000 ); + int selected_sockets = epoll_wait(w->epoll_fd, events, DAP_MAX_EPOLL_EVENTS, 1000); - if ( selected_sockets == -1 ) { - if ( errno == EINTR ) - continue; - break; - } - - time_t cur_time = time( NULL ); - - for( int32_t n = 0; n < selected_sockets; n ++ ) { - - cur = (dap_events_socket_t *)events[n].data.ptr; - - if ( !cur ) { - - log_it( L_ERROR,"dap_events_socket NULL" ); - continue; - } - - //connection already closed (EPOLLHUP - shutdown has been made in both directions) - if(events[n].events & EPOLLHUP && events[n].events & EPOLLERR) { - log_it( L_DEBUG,"Socket error (EPOLLHUP): 0x%x",events[n].events ); - if(!(events[n].events & EPOLLIN)) - cur->no_close = false; - cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - } - - if ( events[n].events & EPOLLERR ) { - log_it( L_ERROR,"Socket error: %s",strerror(errno) ); - cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - cur->callbacks->error_callback( cur, NULL ); // Call callback to process error event - } - - cur->last_time_active = cur_time; - - if( events[n].events & EPOLLIN ) { - - //log_it(DEBUG,"Comes connection in active read set"); - if( cur->buf_in_size == sizeof(cur->buf_in) ) { - log_it( L_WARNING, "Buffer is full when there is smth to read. Its dropped!" ); - cur->buf_in_size = 0; - } - - int32_t bytes_read = recv( cur->socket, (char *)(cur->buf_in + cur->buf_in_size), - sizeof(cur->buf_in) - cur->buf_in_size, 0 ); - if( bytes_read > 0 ) { - cur->buf_in_size += bytes_read; - //log_it(DEBUG, "Received %d bytes", bytes_read); - cur->callbacks->read_callback( cur, NULL ); // Call callback to process read event. At the end of callback buf_in_size should be zero if everything was read well - } - else if( bytes_read < 0 ) { - log_it( L_ERROR,"Some error occured in recv() function: %s",strerror(errno) ); - dap_events_socket_set_readable( cur, false ); - cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - } - else if ( bytes_read == 0 ) { - log_it( L_INFO, "Client socket disconnected" ); - dap_events_socket_set_readable( cur, false ); - cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + if(selected_sockets == -1) { + if( errno == EINTR) + continue; + break; } - } - - // Socket is ready to write - if( ( (events[n].events & EPOLLOUT) || (cur->flags & DAP_SOCK_READY_TO_WRITE) ) && !(cur->flags & DAP_SOCK_SIGNAL_CLOSE) ) { - ///log_it(DEBUG, "Main loop output: %u bytes to send",sa_cur->buf_out_size); - cur->callbacks->write_callback( cur, NULL ); // Call callback to process write event - if( cur->flags & DAP_SOCK_READY_TO_WRITE ) { + time_t cur_time = time( NULL); + for(int32_t n = 0; n < selected_sockets; n++) { - static const uint32_t buf_out_zero_count_max = 20; - cur->buf_out[cur->buf_out_size] = 0; + cur = (dap_events_socket_t *) events[n].data.ptr; - if( !cur->buf_out_size ) { + if(!cur) { - log_it(L_WARNING, "Output: nothing to send. Why we are in write socket set?"); - cur->buf_out_zero_count ++; - - if( cur->buf_out_zero_count > buf_out_zero_count_max ) { // How many time buf_out on write event could be empty - log_it( L_ERROR, "Output: nothing to send %u times, remove socket from the write set", buf_out_zero_count_max ); - dap_events_socket_set_writable( cur, false ); + log_it(L_ERROR, "dap_events_socket NULL"); + continue; + } + log_it(L_DEBUG, "Worker=%d fd=%d socket=%d event=0x%x(%d)", w->number_thread, w->epoll_fd,cur->socket, events[n].events,events[n].events); + + //connection already closed (EPOLLHUP - shutdown has been made in both directions) + if(events[n].events & EPOLLHUP) { // && events[n].events & EPOLLERR) { + log_it(L_DEBUG, "Socket shutdown (EPOLLHUP): %s", strerror(errno)); + //if(!(events[n].events & EPOLLIN)) + //cur->no_close = false; + cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + if(!(events[n].events & EPOLLERR)) + cur->callbacks->error_callback(cur, NULL); // Call callback to process error event } - } - else - cur->buf_out_zero_count = 0; - } - for ( total_sent = 0; total_sent < cur->buf_out_size; ) { // If after callback there is smth to send - we do it - - bytes_sent = send( cur->socket, (char *)(cur->buf_out + total_sent), - cur->buf_out_size - total_sent, MSG_DONTWAIT | MSG_NOSIGNAL ); - - if ( bytes_sent < 0 ) { - log_it(L_ERROR,"Some error occured in send() function"); - cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - break; - } - total_sent += bytes_sent; - //log_it(L_DEBUG, "Output: %u from %u bytes are sent ", total_sent,sa_cur->buf_out_size); - } - //log_it(L_DEBUG,"Output: sent %u bytes",total_sent); - cur->buf_out_size = 0; - } - - if ( (cur->flags & DAP_SOCK_SIGNAL_CLOSE) && !cur->no_close ) { - - pthread_mutex_lock( &w->locker_on_count ); - - if ( cur->kill_signal ) { - pthread_mutex_unlock( &w->locker_on_count ); - continue; - } -// pthread_mutex_unlock( &dsth->mutex_dlist_add_remove ); -// dap_server_kill_socket( dap_cur ); -// continue; + if(events[n].events & EPOLLERR) { + log_it(L_ERROR, "Socket error: %s", strerror(errno)); + cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + cur->callbacks->error_callback(cur, NULL); // Call callback to process error event + } - log_it( L_INFO, "Got signal to close %s, sock %u [thread %u]", cur->hostaddr, cur->socket, tn ); + cur->last_time_active = cur_time; + + if(events[n].events & EPOLLIN) { + + //log_it(DEBUG,"Comes connection in active read set"); + if(cur->buf_in_size == sizeof(cur->buf_in)) { + log_it(L_WARNING, "Buffer is full when there is smth to read. Its dropped!"); + cur->buf_in_size = 0; + } + + int32_t bytes_read = recv(cur->socket, (char *) (cur->buf_in + cur->buf_in_size), + sizeof(cur->buf_in) - cur->buf_in_size, 0); + if(bytes_read > 0) { + cur->buf_in_size += bytes_read; + //log_it(DEBUG, "Received %d bytes", bytes_read); + cur->callbacks->read_callback(cur, NULL); // Call callback to process read event. At the end of callback buf_in_size should be zero if everything was read well + } + else if(bytes_read < 0) { + log_it(L_ERROR, "Some error occured in recv() function: %s", strerror(errno)); + dap_events_socket_set_readable(cur, false); + cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + } + else if(bytes_read == 0) { + log_it(L_INFO, "Client socket disconnected"); + dap_events_socket_set_readable(cur, false); + cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + } + } - dap_events_socket_remove_and_delete( cur, false ); - pthread_mutex_unlock( &w->locker_on_count ); - } - } // for + // Socket is ready to write + if(((events[n].events & EPOLLOUT) || (cur->flags & DAP_SOCK_READY_TO_WRITE)) + && !(cur->flags & DAP_SOCK_SIGNAL_CLOSE)) { + ///log_it(DEBUG, "Main loop output: %u bytes to send",sa_cur->buf_out_size); + cur->callbacks->write_callback(cur, NULL); // Call callback to process write event + + if(cur->flags & DAP_SOCK_READY_TO_WRITE) { + + static const uint32_t buf_out_zero_count_max = 20; + cur->buf_out[cur->buf_out_size] = 0; + + if(!cur->buf_out_size) { + + log_it(L_WARNING, "Output: nothing to send. Why we are in write socket set?"); + cur->buf_out_zero_count++; + + if(cur->buf_out_zero_count > buf_out_zero_count_max) { // How many time buf_out on write event could be empty + log_it(L_ERROR, "Output: nothing to send %u times, remove socket from the write set", + buf_out_zero_count_max); + dap_events_socket_set_writable(cur, false); + } + } + else + cur->buf_out_zero_count = 0; + } + for(total_sent = 0; total_sent < cur->buf_out_size;) { // If after callback there is smth to send - we do it + + bytes_sent = send(cur->socket, (char *) (cur->buf_out + total_sent), + cur->buf_out_size - total_sent, MSG_DONTWAIT | MSG_NOSIGNAL); + + if(bytes_sent < 0) { + log_it(L_ERROR, "Some error occured in send() function"); + cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + break; + } + total_sent += bytes_sent; + //log_it(L_DEBUG, "Output: %u from %u bytes are sent ", total_sent,sa_cur->buf_out_size); + } + //log_it(L_DEBUG,"Output: sent %u bytes",total_sent); + cur->buf_out_size = 0; + } - #ifndef NO_TIMER - if ( cur_time >= next_time_timeout_check ) { + pthread_mutex_lock(&w->locker_on_count); - s_socket_all_check_activity( w, w->events, cur_time ); - next_time_timeout_check = cur_time + s_connection_timeout / 2; - } - #endif + if((cur->flags & DAP_SOCK_SIGNAL_CLOSE) && !cur->no_close) { + // protect against double deletion + cur->kill_signal = true; + //dap_events_socket_remove_and_delete(cur, true); + log_it(L_INFO, "Got signal to close %s, sock %u [thread %u]", cur->hostaddr, cur->socket, tn); + } - pthread_mutex_lock( &w->locker_on_count ); - if ( !w->event_to_kill_count ) { + if(cur->kill_signal) { + log_it(L_INFO, "Kill %u socket (processed).... [ thread %u ]", cur->socket, tn); + dap_events_socket_remove(cur); + pthread_mutex_unlock(&w->locker_on_count); + dap_events_socket_delete( cur, true); + } + else + pthread_mutex_unlock(&w->locker_on_count); - pthread_mutex_unlock( &w->locker_on_count ); - continue; - } + /* + if(!w->event_to_kill_count) { - cur = w->events->to_kill_sockets; + pthread_mutex_unlock(&w->locker_on_count); + continue; - do { + do { // if ( cur->no_close ) { // cur = cur->knext; // continue; // } + tmp = cur_del->knext; + + // delete only current events_socket because others may be active in the other workers + //if(cur_del == cur) + if(cur->kill_signal) { + log_it(L_INFO, "Kill %u socket (processed).... [ thread %u ]", cur_del->socket, tn); + DL_LIST_REMOVE_NODE(w->events->to_kill_sockets, cur, kprev, knext, w->event_to_kill_count); + dap_events_socket_remove_and_delete(cur_del, true); + } + cur_del = tmp; + + } while(cur_del); + + log_it(L_INFO, "[ Thread %u ] coneections: %u, to kill: %u", tn, w->event_sockets_count, + w->event_to_kill_count); + + pthread_mutex_unlock(&w->locker_on_count); + */ + } // for + +#ifndef NO_TIMER + if(cur_time >= next_time_timeout_check) { + s_socket_all_check_activity(w, w->events, cur_time); + next_time_timeout_check = cur_time + s_connection_timeout / 2; + } +#endif - log_it( L_INFO, "Kill %u socket .... [ thread %u ]", cur->socket, tn ); - - tmp = cur->knext; - DL_LIST_REMOVE_NODE( w->events->to_kill_sockets, cur, kprev, knext, w->event_to_kill_count ); - - dap_events_socket_remove_and_delete( cur, false ); - cur = tmp; - - } while ( cur ); - - log_it( L_INFO, "[ Thread %u ] coneections: %u, to kill: %u", tn, w->event_sockets_count, w->event_to_kill_count ); - pthread_mutex_unlock( &w->locker_on_count ); - - } // while + } // while - return NULL; + return NULL; } /** @@ -533,7 +512,7 @@ int dap_events_start( dap_events_t *a_events ) return -1; } - s_workers[i].event_to_kill_count = 0; + //s_workers[i].event_to_kill_count = 0; s_workers[i].event_sockets_count = 0; s_workers[i].number_thread = i; s_workers[i].events = a_events; @@ -562,8 +541,6 @@ int dap_events_wait( dap_events_t *sh ) return 0; } - - /** * @brief dap_worker_add_events_socket * @param a_worker @@ -578,23 +555,6 @@ void dap_worker_add_events_socket( dap_events_socket_t *a_es) a_es->events = a_es->dap_worker->events; } -/** - * @brief dap_events_socket_delete - * @param a_es - */ -void dap_events_socket_remove_and_delete( dap_events_socket_t *a_es, bool preserve_inheritor ) -{ - if ( epoll_ctl( a_es->dap_worker->epoll_fd, EPOLL_CTL_DEL, a_es->socket, &a_es->ev) == -1 ) - log_it( L_ERROR,"Can't remove event socket's handler from the epoll_fd" ); - else - log_it( L_DEBUG,"Removed epoll's event from dap_worker #%u", a_es->dap_worker->number_thread ); - - DL_DELETE( a_es->events->dlsockets, a_es ); - a_es->dap_worker->event_sockets_count --; - - dap_events_socket_delete( a_es, preserve_inheritor ); -} - /** * @brief dap_events__thread_wake_up * @param th diff --git a/src/dap_events_socket.c b/src/dap_events_socket.c index c186a1de7b8b501279cd6d46819b00bfac01ab18..e22a45c3625120cf0b9202d15fb5898385177863 100755 --- a/src/dap_events_socket.c +++ b/src/dap_events_socket.c @@ -173,9 +173,11 @@ dap_events_socket_t * dap_events_socket_wrap2( dap_server_t *a_server, struct da dap_events_socket_t *dap_events_socket_find( int sock, struct dap_events *a_events ) { dap_events_socket_t *ret = NULL; - + if(!a_events) + return NULL; pthread_rwlock_rdlock( &a_events->sockets_rwlock ); - HASH_FIND_INT( a_events->sockets, &sock, ret ); + if(a_events->sockets) + HASH_FIND_INT( a_events->sockets, &sock, ret ); pthread_rwlock_unlock( &a_events->sockets_rwlock ); return ret; @@ -246,6 +248,37 @@ void dap_events_socket_set_writable( dap_events_socket_t *sc, bool is_ready ) } +/** + * @brief dap_events_socket_kill_socket + * @param sc Connection instance + */ +int dap_events_socket_kill_socket( dap_events_socket_t *a_es ) +{ + if ( !a_es ) { + log_it( L_ERROR, "dap_events_socket_kill_socket( NULL )" ); + return -1; + } + + uint32_t tn = a_es->dap_worker->number_thread; + + dap_worker_t *w = a_es->dap_worker; + //dap_events_t *d_ev = w->events; + + pthread_mutex_lock( &w->locker_on_count ); + if ( a_es->kill_signal ) { + pthread_mutex_unlock( &w->locker_on_count ); + return 0; + } + + log_it( L_DEBUG, "KILL %u socket! (in queue) [ thread %u ]", a_es->socket, tn ); + + a_es->kill_signal = true; + //DL_LIST_ADD_NODE_HEAD( d_ev->to_kill_sockets, a_es, kprev, knext, w->event_to_kill_count ); + + pthread_mutex_unlock( &w->locker_on_count ); + return 0; +} + /** * @brief dap_events_socket_remove Removes the client from the list * @param sc Connection instance @@ -256,8 +289,13 @@ void dap_events_socket_delete( dap_events_socket_t *a_es, bool preserve_inherito log_it( L_DEBUG, "es is going to be removed from the lists and free the memory (0x%016X)", a_es ); + if(!dap_events_socket_find(a_es->socket, a_es->events)){ + log_it( L_ERROR, "dap_events_socket 0x%x already deleted", a_es); + return ; + } pthread_rwlock_wrlock( &a_es->events->sockets_rwlock ); - HASH_DEL( a_es->events->sockets, a_es ); + if(a_es->events->sockets) + HASH_DEL( a_es->events->sockets, a_es ); pthread_rwlock_unlock( &a_es->events->sockets_rwlock ); log_it( L_DEBUG, "dap_events_socket wrapped around %d socket is removed", a_es->socket ); @@ -266,7 +304,7 @@ void dap_events_socket_delete( dap_events_socket_t *a_es, bool preserve_inherito a_es->callbacks->delete_callback( a_es, NULL ); // Init internal structure if ( a_es->_inheritor && !preserve_inheritor ) - free( a_es->_inheritor ); + DAP_DELETE( a_es->_inheritor ); if ( a_es->socket ) { #ifdef _WIN32 @@ -279,6 +317,34 @@ void dap_events_socket_delete( dap_events_socket_t *a_es, bool preserve_inherito free( a_es ); } +/** + * @brief dap_events_socket_delete + * @param a_es + */ +void dap_events_socket_remove( dap_events_socket_t *a_es) +{ + if ( epoll_ctl( a_es->dap_worker->epoll_fd, EPOLL_CTL_DEL, a_es->socket, &a_es->ev) == -1 ) + log_it( L_ERROR,"Can't remove event socket's handler from the epoll_fd" ); + else + log_it( L_DEBUG,"Removed epoll's event from dap_worker #%u", a_es->dap_worker->number_thread ); + + DL_DELETE( a_es->events->dlsockets, a_es ); + a_es->dap_worker->event_sockets_count --; +} + +void dap_events_socket_remove_and_delete( dap_events_socket_t *a_es, bool preserve_inheritor ) +{ + if ( epoll_ctl( a_es->dap_worker->epoll_fd, EPOLL_CTL_DEL, a_es->socket, &a_es->ev) == -1 ) + log_it( L_ERROR,"Can't remove event socket's handler from the epoll_fd" ); + else + log_it( L_DEBUG,"Removed epoll's event from dap_worker #%u", a_es->dap_worker->number_thread ); + + DL_DELETE( a_es->events->dlsockets, a_es ); + a_es->dap_worker->event_sockets_count --; + + dap_events_socket_delete( a_es, preserve_inheritor ); +} + /** * @brief dap_events_socket_write Write data to the client * @param sc Conn instance