diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index b711ceae5b3d342e74e751057e1992eba00047c9..1d0e361b64abb67a664f4ae66683e33bcb9af99f 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -184,16 +184,23 @@ dap_events_socket_t * s_create_type_pipe(dap_worker_t * a_w, dap_events_socket_c l_errbuf[0]=0; if( pipe(l_pipe) < 0 ){ l_errno = errno; +#if defined DAP_OS_UNIX strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); log_it( L_ERROR, "Error detected, can't create pipe(): '%s' (%d)", l_errbuf, l_errno); +#elif defined DAP_OS_WINDOWS + log_it( L_ERROR, "Can't create pipe, errno: %d", l_errno); +#endif DAP_DELETE(l_es); return NULL; }//else // log_it(L_DEBUG, "Created one-way unnamed bytestream pipe %d->%d", l_pipe[0], l_pipe[1]); l_es->fd = l_pipe[0]; l_es->fd2 = l_pipe[1]; +#if defined DAP_OS_UNIX fcntl( l_pipe[0], F_SETFL, O_NONBLOCK); fcntl( l_pipe[1], F_SETFL, O_NONBLOCK); + // this sort of fd doesn't suit ioctlsocket()... +#endif #else #error "No defined s_create_type_pipe() for your platform" @@ -425,8 +432,20 @@ dap_events_socket_t * s_create_type_event(dap_worker_t * a_w, dap_events_socket_ } DAP_DELETE(l_es); return NULL; - }else + }else { + l_es->fd2 = l_es->fd; log_it(L_DEBUG, "Created eventfd descriptor %d", l_es->fd ); + } +#elif defined DAP_OS_WINDOWS + int l_pipe[2]; + if (pipe(l_pipe) < 0) { + log_it(L_ERROR, "Can't create pipe for event type, error: %d", errno); + DAP_DELETE(l_es); + return NULL; + } + l_es->fd2 = l_pipe[0]; + l_es->fd = l_pipe[1]; + log_it(L_DEBUG, "Created pipe for event type, %d -> %d", l_es->fd2, l_es->fd); #endif return l_es; } @@ -480,11 +499,24 @@ void dap_events_socket_event_proc_input_unsafe(dap_events_socket_t *a_esocket) log_it(L_WARNING, "Can't read packet from event fd: \"%s\"(%d)", l_errbuf, l_errno); }else return; // do nothing +#elif defined DAP_OS_WINDOWS + uint64_t l_value; + int l_ret; + switch (l_ret = read(a_esocket->fd, &l_value, 8)) { + case -1: + log_it(L_CRITICAL, "Can't read from event socket pipe, error: %d", errno); + break; + case 0: + return; + default: + a_esocket->callbacks.event_callback(a_esocket, l_value); + break; + } #else #error "No Queue fetch mechanism implemented on your platform" #endif }else - log_it(L_ERROR, "Queue socket %d accepted data but callback is NULL ", a_esocket->socket); + log_it(L_ERROR, "Event socket %d accepted data but callback is NULL ", a_esocket->socket); } @@ -627,6 +659,13 @@ int dap_events_socket_event_signal( dap_events_socket_t * a_es, uint64_t a_value return l_errno; else return 1; +#elif defined DAP_OS_WINDOWS + byte_t l_bytes[sizeof(void*)] = { 0 }; + if(write(a_es->fd2, l_bytes, sizeof(l_bytes)) == -1) { + return errno; + } else { + return 0; + } #else #error "Not implemented dap_events_socket_event_signal() for this platform" #endif diff --git a/dap-sdk/net/core/dap_proc_thread.c b/dap-sdk/net/core/dap_proc_thread.c index 86afea3b6d3b8f3b5b0bfbc43f5f4b9f6f60e933..1cd2757ba4c14fec8367ef177599e1e838e0a394 100644 --- a/dap-sdk/net/core/dap_proc_thread.c +++ b/dap-sdk/net/core/dap_proc_thread.c @@ -215,7 +215,7 @@ static void * s_proc_thread_function(void * a_arg) #ifdef DAP_EVENTS_CAPS_EPOLL //log_it(L_DEBUG, "Epoll_wait call"); int l_selected_sockets = epoll_wait(l_thread->epoll_ctl, l_epoll_events, DAP_EVENTS_SOCKET_MAX, -1); - size_t l_sockets_max = l_selected_sockets; + size_t l_sockets_max = (size_t)l_selected_sockets; #elif defined (DAP_EVENTS_CAPS_POLL) int l_selected_sockets = poll(l_poll,l_poll_count,-1); size_t l_sockets_max = l_poll_count; @@ -226,10 +226,14 @@ static void * s_proc_thread_function(void * a_arg) if(l_selected_sockets == -1) { if( errno == EINTR) continue; +#if defined DAP_OS_UNIX int l_errno = errno; char l_errbuf[128]; strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); log_it(L_ERROR, "Proc thread #%d got errno:\"%s\" (%d)", l_thread->cpu_id , l_errbuf, l_errno); +#elif DAP_OS_WINDOWS + log_it(L_ERROR, "Error occured on thread #%d, errno: %d", l_thread->cpu_id , errno); +#endif break; } for(size_t n = 0; n < l_sockets_max; n++) { @@ -268,23 +272,29 @@ static void * s_proc_thread_function(void * a_arg) time_t l_cur_time = time( NULL); l_cur->last_time_active = l_cur_time; if (l_flag_error){ +#if defined DAP_OS_UNIX int l_errno = errno; char l_errbuf[128]; strerror_r(l_errno, l_errbuf,sizeof (l_errbuf)); log_it(L_ERROR,"Some error on proc thread #%u with %d socket: %s(%d)",l_thread->cpu_id, l_cur->socket, l_errbuf, l_errno); +#elif defined DAP_OS_WINDOWS + log_it(L_ERROR,"Some error occured on thread #%u with socket %d, errno: %d",l_thread->cpu_id, l_cur->socket, errno); +#endif if(l_cur->callbacks.error_callback) - l_cur->callbacks.error_callback(l_cur,errno); + l_cur->callbacks.error_callback(l_cur, errno); } if (l_flag_read ){ switch (l_cur->type) { case DESCRIPTOR_TYPE_QUEUE: - dap_events_socket_queue_proc_input_unsafe(l_cur); - break; + dap_events_socket_queue_proc_input_unsafe(l_cur); + break; case DESCRIPTOR_TYPE_EVENT: - dap_events_socket_event_proc_input_unsafe (l_cur); - break; + dap_events_socket_event_proc_input_unsafe (l_cur); + break; - default:{ log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop"); } + default: + log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop"); + break; } } if(l_cur->flags & DAP_SOCK_SIGNAL_CLOSE){ diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index a74724f2302022bec5da9ef9de9c5173b78c5aec..b65f82e41e8a85463b9248d6f99234f2a8f3a887 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -69,7 +69,10 @@ void __stdcall TimerAPCb(void* arg, DWORD low, DWORD high) { // Timer high valu UNREFERENCED_PARAMETER(low) UNREFERENCED_PARAMETER(high) dap_timerfd_t *l_timerfd = (dap_timerfd_t *)arg; - write(l_timerfd->tfd2, 0, sizeof(void*)); + byte_t l_bytes[sizeof(void*)] = { 0 }; + if (write(l_timerfd->pipe_in, l_bytes, sizeof(l_bytes)) == -1) { + log_it(L_CRITICAL, "Error occured on writing into pipe from APC, errno: %d", errno); + } } #endif @@ -149,10 +152,10 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t l_timerfd->repeated = a_repeated; #ifdef DAP_OS_WINDOWS l_timerfd->th = l_th; - l_timerfd->tfd2 = l_pipe[1]; - ioctlsocket(l_pipe[0], FIONBIO, &l_mode); + l_timerfd->pipe_in = l_pipe[1]; + /*ioctlsocket(l_pipe[0], FIONBIO, &l_mode); l_mode = 0; - ioctlsocket(l_pipe[1], FIONBIO, &l_mode); + ioctlsocket(l_pipe[1], FIONBIO, &l_mode);*/ #endif dap_worker_add_events_socket(l_events_socket, a_worker); return l_timerfd; diff --git a/dap-sdk/net/core/include/dap_timerfd.h b/dap-sdk/net/core/include/dap_timerfd.h index c8c524b3a2a2ae32278dddac7c28a84a88004bbf..097f8cf68626073317f0e9f11f9f173fc1f14e05 100644 --- a/dap-sdk/net/core/include/dap_timerfd.h +++ b/dap-sdk/net/core/include/dap_timerfd.h @@ -49,7 +49,7 @@ typedef struct dap_timerfd { bool repeated; #ifdef DAP_OS_WINDOWS HANDLE th; - int tfd2; + int pipe_in; #endif } dap_timerfd_t;