From 4358b7ffb5d80f975995824a8934a3d32953208b Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Sun, 23 Aug 2020 17:01:52 +0700
Subject: [PATCH] [*] Fixes for timer

---
 dap-sdk/net/core/dap_timerfd.c         | 63 ++++++++++----------------
 dap-sdk/net/core/include/dap_timerfd.h |  2 +-
 2 files changed, 24 insertions(+), 41 deletions(-)

diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c
index cae976769a..ceccfc5de2 100644
--- a/dap-sdk/net/core/dap_timerfd.c
+++ b/dap-sdk/net/core/dap_timerfd.c
@@ -38,36 +38,8 @@
 #include "dap_timerfd.h"
 
 #define LOG_TAG "dap_timerfd"
+static void s_es_callback_timer(struct dap_events_socket *a_event_sock);
 
-static void s_es_time_callback( dap_events_socket_t * a_es);
-
-void callback_timerfd_read(struct dap_events_socket *a_event_sock, void * arg)
-{
-    uint64_t l_ptiu64;
-    size_t l_read_ret;
-    do {
-        l_read_ret = dap_events_socket_pop_from_buf_in(a_event_sock, &l_ptiu64, sizeof(l_ptiu64));
-
-        if(l_read_ret > 0) {
-            dap_timerfd_t *l_timerfd = a_event_sock->_inheritor;
-            //printf("\nread() returned %d, %d\n", l_ptiu64, l_read_ret);
-            struct itimerspec l_ts;
-            // first expiration in 0 seconds after times start
-            l_ts.it_interval.tv_sec = 0;
-            l_ts.it_interval.tv_nsec = 0;
-            // timeout for timer
-            l_ts.it_value.tv_sec = l_timerfd->timeout_ms / 1000;
-            l_ts.it_value.tv_nsec = (l_timerfd->timeout_ms % 1000) * 1000000;
-            if(timerfd_settime(l_timerfd->tfd, 0, &l_ts, NULL) < 0) {
-                log_it(L_WARNING, "callback_timerfd_read() failed: timerfd_settime() errno=%d\n", errno);
-            }
-            // run user's callback
-            if(l_timerfd->callback)
-                l_timerfd->callback(l_timerfd->callback_arg);
-        }
-    } while(l_read_ret > 0);
-    dap_events_socket_set_readable_unsafe(a_event_sock, true);
-}
 
 /**
  * @brief dap_events_socket_init Init clients module
@@ -125,7 +97,7 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t
     // create events_socket for timer file descriptor
     dap_events_socket_callbacks_t l_s_callbacks;
     memset(&l_s_callbacks,0,sizeof (l_s_callbacks));
-    l_s_callbacks.timer_callback = s_es_time_callback;
+    l_s_callbacks.timer_callback = s_es_callback_timer;
 
     dap_events_socket_t * l_events_socket = dap_events_socket_wrap_no_add(a_worker->events, l_tfd, &l_s_callbacks);
     l_events_socket->type = DESCRIPTOR_TYPE_TIMER;
@@ -144,25 +116,36 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t
 }
 
 /**
- * @brief s_es_time_callback
- * @param a_es
+ * @brief s_es_callback_timer
+ * @param a_event_sock
  */
-static void s_es_time_callback( dap_events_socket_t * a_es)
+static void s_es_callback_timer(struct dap_events_socket *a_event_sock)
 {
-    dap_timerfd_t * l_timer = (dap_timerfd_t*) a_es->_inheritor;
-    assert(l_timer);
-    if( l_timer->callback)
-        l_timer->callback(l_timer->callback_arg);
+    uint64_t l_ptiu64;
+    dap_timerfd_t *l_timerfd = a_event_sock->_inheritor;
+    //printf("\nread() returned %d, %d\n", l_ptiu64, l_read_ret);
+    struct itimerspec l_ts;
+    // first expiration in 0 seconds after times start
+    l_ts.it_interval.tv_sec = 0;
+    l_ts.it_interval.tv_nsec = 0;
+    // timeout for timer
+    l_ts.it_value.tv_sec = l_timerfd->timeout_ms / 1000;
+    l_ts.it_value.tv_nsec = (l_timerfd->timeout_ms % 1000) * 1000000;
+    if(timerfd_settime(l_timerfd->tfd, 0, &l_ts, NULL) < 0) {
+        log_it(L_WARNING, "callback_timerfd_read() failed: timerfd_settime() errno=%d\n", errno);
+    }
+    // run user's callback
+    if(l_timerfd->callback)
+        l_timerfd->callback(l_timerfd->callback_arg);
+    dap_events_socket_set_readable_unsafe(a_event_sock, true);
 }
 
-
 /**
  * @brief dap_timerfd_stop
  * @param a_tfd
  * @param a_callback
- * @return 0 or <0 if error
  */
-int dap_timerfd_delete(dap_timerfd_t *l_timerfd)
+void dap_timerfd_delete(dap_timerfd_t *l_timerfd)
 {
     dap_events_socket_queue_remove_and_delete(l_timerfd->events_socket);
 }
diff --git a/dap-sdk/net/core/include/dap_timerfd.h b/dap-sdk/net/core/include/dap_timerfd.h
index af0a34b874..4dd8f4419a 100644
--- a/dap-sdk/net/core/include/dap_timerfd.h
+++ b/dap-sdk/net/core/include/dap_timerfd.h
@@ -47,5 +47,5 @@ typedef struct dap_timerfd {
 int dap_timerfd_init();
 dap_timerfd_t* dap_timerfd_start(uint64_t a_timeout_ms, dap_timerfd_callback_t a_callback, void *callback_arg);
 dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_timeout_ms, dap_timerfd_callback_t a_callback, void *a_callback_arg);
-int dap_timerfd_delete(dap_timerfd_t *l_timerfd);
+void dap_timerfd_delete(dap_timerfd_t *l_timerfd);
 
-- 
GitLab