diff --git a/3rdparty/cuttdb/src/cdb_bgtask.c b/3rdparty/cuttdb/src/cdb_bgtask.c index da998c2b0a0f164350186c74e1bed80f95f5d633..a103c5f8d8acc632e7899b3c05b286028bdeb0bb 100644 --- a/3rdparty/cuttdb/src/cdb_bgtask.c +++ b/3rdparty/cuttdb/src/cdb_bgtask.c @@ -15,6 +15,7 @@ #include "cdb_bgtask.h" #include <stdlib.h> +#include <errno.h> #ifndef _WIN32 #include <sys/signal.h> #else @@ -69,6 +70,7 @@ static void *_cdb_bgtask_func(void *arg) while(bt->run) { time_t now = time(NULL); struct timespec timeout; + int l_cond_rc; /* check should run some tasks every 1 second */ timeout.tv_sec = now + 1; @@ -82,7 +84,9 @@ static void *_cdb_bgtask_func(void *arg) task->ltime = now; } } - pthread_cond_timedwait(&bt->scond, &bt->smutex, &timeout); + pthread_mutex_lock(&bt->smutex); + l_cond_rc = pthread_cond_timedwait(&bt->scond, &bt->smutex, &timeout); + pthread_mutex_unlock(&bt->smutex); } return NULL; diff --git a/dap-sdk/net/core/dap_events.c b/dap-sdk/net/core/dap_events.c index 0f3d96c544f6c1086c02fecd70782fd4f9b15486..0228f5b783da4bde285bc17092b98a73ea78e856 100644 --- a/dap-sdk/net/core/dap_events.c +++ b/dap-sdk/net/core/dap_events.c @@ -430,8 +430,6 @@ static void *thread_worker_function(void *arg) } } - pthread_mutex_lock(&w->locker_on_count); - if((cur->flags & DAP_SOCK_SIGNAL_CLOSE) && !cur->no_close) { // protect against double deletion cur->kill_signal = true; @@ -442,11 +440,8 @@ static void *thread_worker_function(void *arg) 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); /* if(!w->event_to_kill_count) { diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index 1510d671b88134231a8e7f1c193380b9677b8a64..c73c4d00390b4104b93806d33074a6e162415820 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -274,9 +274,7 @@ int dap_events_socket_kill_socket( dap_events_socket_t *a_es ) //dap_events_t *d_ev = w->events; - pthread_mutex_lock( &a_es->dap_worker->locker_on_count ); if ( a_es->kill_signal ) { - pthread_mutex_unlock( &a_es->dap_worker ->locker_on_count ); return 0; } @@ -285,7 +283,6 @@ int dap_events_socket_kill_socket( dap_events_socket_t *a_es ) 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( &a_es->dap_worker->locker_on_count ); return 0; } @@ -333,6 +330,7 @@ void dap_events_socket_delete( dap_events_socket_t *a_es, bool preserve_inherito */ void dap_events_socket_remove( dap_events_socket_t *a_es) { + pthread_mutex_lock(&a_es->dap_worker->locker_on_count); 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 @@ -340,10 +338,12 @@ void dap_events_socket_remove( dap_events_socket_t *a_es) DL_DELETE( a_es->events->dlsockets, a_es ); a_es->dap_worker->event_sockets_count --; + pthread_mutex_unlock(&a_es->dap_worker->locker_on_count); } void dap_events_socket_remove_and_delete( dap_events_socket_t *a_es, bool preserve_inheritor ) { + pthread_mutex_lock(&a_es->dap_worker->locker_on_count); 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 @@ -351,6 +351,7 @@ void dap_events_socket_remove_and_delete( dap_events_socket_t *a_es, bool prese DL_DELETE( a_es->events->dlsockets, a_es ); a_es->dap_worker->event_sockets_count --; + pthread_mutex_unlock(&a_es->dap_worker->locker_on_count); dap_events_socket_delete( a_es, preserve_inheritor ); } diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index 3f47e681ec9f61d8287a676eb0a21113593c7687..bbc3bbd5e526c50636b85f3bec4531814a7a8e32 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -642,6 +642,7 @@ void *thread_loop( void *arg ) CPU_SET( tn, &mask ); int err; + int l_sock_err = 0, l_sock_err_size = sizeof(l_sock_err); #ifndef ANDROID err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &mask); #else @@ -690,7 +691,8 @@ void *thread_loop( void *arg ) dap_cur->last_time_active = cur_time; if( events[i].events & EPOLLERR ) { - log_it( L_ERROR,"Socket error: %u, remove it" , dap_cur->socket ); + getsockopt(dap_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_sock_err, (socklen_t *)&l_sock_err_size); + log_it( L_ERROR,"Socket %u error: %s, remove it" , dap_cur->socket, strerror(l_sock_err)); dap_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; } set_nonblock_socket(dap_cur->socket); diff --git a/dap-sdk/net/core/include/dap_events.h b/dap-sdk/net/core/include/dap_events.h index 149784bdca53d168ee0dc58f3feabb5e3f9dcc38..e7b7777b1087b98c104d33bc0c91860f0d8b4d4d 100644 --- a/dap-sdk/net/core/include/dap_events.h +++ b/dap-sdk/net/core/include/dap_events.h @@ -28,6 +28,7 @@ #include <stdint.h> #include <pthread.h> +#include <stdatomic.h> #define EPOLL_HANDLE int #else #define EPOLL_HANDLE HANDLE @@ -62,7 +63,7 @@ typedef struct dap_events { typedef struct dap_worker { - uint32_t event_sockets_count; + atomic_uint event_sockets_count; //uint32_t event_to_kill_count; EPOLL_HANDLE epoll_fd; diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index 66cf438a94aadee7dcabf4cec23c06a902a9a536..99ebe57b2bc355c41ecf4545b16a6547867bae23 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -26,6 +26,7 @@ #include <stdint.h> #include <stddef.h> #include <stdbool.h> +#include <stdatomic.h> #include "uthash.h" #ifndef _WIN32 #include <sys/epoll.h> @@ -103,7 +104,7 @@ typedef struct dap_events_socket { uint32_t flags; // bool signal_close; bool no_close; - bool kill_signal; + atomic_bool kill_signal; // bool _ready_to_write; // bool _ready_to_read;