From 3fffb23237376a17c146e17d343f7c204cceac01 Mon Sep 17 00:00:00 2001
From: Constantin Papizh <p.const@bk.ru>
Date: Fri, 17 Jul 2020 19:08:02 +0300
Subject: [PATCH] Some epolling issues

---
 dap-sdk/net/core/dap_server.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c
index b92ae2a8fb..e277971f01 100644
--- a/dap-sdk/net/core/dap_server.c
+++ b/dap-sdk/net/core/dap_server.c
@@ -517,9 +517,20 @@ static void read_write_cb( dap_client_remote_t *dap_cur, int32_t revents )
                                    dap_cur->buf_out_size - total_sent,
                                    MSG_DONTWAIT | MSG_NOSIGNAL );
         if( bytes_sent < 0 ) {
-          log_it(L_ERROR,"[THREAD %u] Error occured in send() function %s", dap_cur->tn, strerror(errno) );
-          dap_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
-          break;
+            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
+                dap_cur->pevent.events = EPOLLOUT | EPOLLERR;
+                if( epoll_ctl(dap_cur->efd, EPOLL_CTL_MOD, dap_cur->socket, &dap_cur->pevent) != 0 ) {
+                    log_it( L_ERROR, "epoll_ctl failed..." );
+                    dap_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                    break;
+                } else {
+                    log_it( L_INFO, "wait for available space in buff..." );
+                }
+            } else {
+                log_it(L_ERROR,"[THREAD %u] Error occured in send() function %s", dap_cur->tn, strerror(errno) );
+                dap_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                break;
+            }
         }
 
         total_sent += (size_t)bytes_sent;
@@ -684,9 +695,7 @@ void  *thread_loop( void *arg )
           log_it( L_ERROR,"Socket error: %u, remove it" , dap_cur->socket );
           dap_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
       }
-#ifdef _WIN32
-      set_nonblock_socket(dap_cur->socket); // pconst: for winsock2 has no appropriate MSG attributes
-#endif
+      set_nonblock_socket(dap_cur->socket);
       if ( !(dap_cur->flags & DAP_SOCK_SIGNAL_CLOSE) || dap_cur->no_close )
         read_write_cb( dap_cur, events[i].events );
 
-- 
GitLab