浏览代码

hloop_stat_timer_cb

ithewei 5 年之前
父节点
当前提交
74c8e5bafe
共有 1 个文件被更改,包括 31 次插入13 次删除
  1. 31 13
      event/hloop.c

+ 31 - 13
event/hloop.c

@@ -10,8 +10,9 @@
 #include "hsocket.h"
 #include "hthread.h"
 
-#define PAUSE_TIME              10          // ms
-#define MAX_BLOCK_TIME          1000        // ms
+#define HLOOP_PAUSE_TIME        10      // ms
+#define HLOOP_MAX_BLOCK_TIME    1000    // ms
+#define HLOOP_STAT_TIMEOUT      60000   // ms
 
 #define IO_ARRAY_INIT_SIZE              1024
 #define CUSTOM_EVENT_QUEUE_INIT_SIZE    16
@@ -122,7 +123,7 @@ static int hloop_process_events(hloop_t* loop) {
     nios = ntimers = nidles = 0;
 
     // calc blocktime
-    int32_t blocktime = MAX_BLOCK_TIME;
+    int32_t blocktime = HLOOP_MAX_BLOCK_TIME;
     if (loop->timers.root) {
         hloop_update_time(loop);
         uint64_t next_min_timeout = TIMER_ENTRY(loop->timers.root)->next_timeout;
@@ -130,7 +131,7 @@ static int hloop_process_events(hloop_t* loop) {
         if (blocktime_us <= 0) goto process_timers;
         blocktime = blocktime_us / 1000;
         ++blocktime;
-        blocktime = MIN(blocktime, MAX_BLOCK_TIME);
+        blocktime = MIN(blocktime, HLOOP_MAX_BLOCK_TIME);
     }
 
     if (loop->nios) {
@@ -153,12 +154,20 @@ process_timers:
         }
     }
     int ncbs = hloop_process_pendings(loop);
-    //printd("blocktime=%d nios=%d/%u ntimers=%d/%u nidles=%d/%u nactives=%d npendings=%d ncbs=%d\n",
-            //blocktime, nios, loop->nios, ntimers, loop->ntimers, nidles, loop->nidles,
-            //loop->nactives, npendings, ncbs);
+    // printd("blocktime=%d nios=%d/%u ntimers=%d/%u nidles=%d/%u nactives=%d npendings=%d ncbs=%d\n",
+    //         blocktime, nios, loop->nios, ntimers, loop->ntimers, nidles, loop->nidles,
+    //         loop->nactives, npendings, ncbs);
     return ncbs;
 }
 
+static void hloop_stat_timer_cb(htimer_t* timer) {
+    hloop_t* loop = timer->loop;
+    // hlog_set_level(LOG_LEVEL_DEBUG);
+    hlogd("[loop] pid=%ld tid=%ld uptime=%lluus cnt=%llu nactives=%u nios=%d ntimers=%d nidles=%u",
+        loop->pid, loop->tid, loop->cur_hrtime - loop->start_hrtime, loop->loop_cnt,
+        loop->nactives, loop->nios, loop->ntimers, loop->nidles);
+}
+
 static void sockpair_read_cb(hio_t* io, void* buf, int readbytes) {
     hloop_t* loop = io->loop;
     hevent_t* pev = NULL;
@@ -235,9 +244,6 @@ static void hloop_init(hloop_t* loop) {
     if (Socketpair(AF_INET, SOCK_STREAM, 0, loop->sockpair) != 0) {
         hloge("socketpair create failed!");
     }
-    if (loop->sockpair[0] != -1 && loop->sockpair[1] != -1) {
-        hread(loop, loop->sockpair[SOCKPAIR_READ_INDEX], loop->readbuf.base, loop->readbuf.len, sockpair_read_cb);
-    }
 
     // NOTE: init start_time here, because htimer_add use it.
     loop->start_ms = gettimeofday_ms();
@@ -323,16 +329,27 @@ void hloop_free(hloop_t** pp) {
 int hloop_run(hloop_t* loop) {
     loop->pid = hv_getpid();
     loop->tid = hv_gettid();
+
+    // intern events
+    int intern_events = 0;
+    if (loop->sockpair[0] != -1 && loop->sockpair[1] != -1) {
+        hread(loop, loop->sockpair[SOCKPAIR_READ_INDEX], loop->readbuf.base, loop->readbuf.len, sockpair_read_cb);
+        ++intern_events;
+    }
+#ifdef DEBUG
+    htimer_add(loop, hloop_stat_timer_cb, HLOOP_STAT_TIMEOUT, INFINITE);
+    ++intern_events;
+#endif
+
     loop->status = HLOOP_STATUS_RUNNING;
     while (loop->status != HLOOP_STATUS_STOP) {
         if (loop->status == HLOOP_STATUS_PAUSE) {
-            msleep(PAUSE_TIME);
+            msleep(HLOOP_PAUSE_TIME);
             hloop_update_time(loop);
             continue;
         }
         ++loop->loop_cnt;
-        // NOTE: socketpair have one HV_READ
-        if (loop->nactives < 2 && loop->flags & HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS) {
+        if (loop->nactives <= intern_events && loop->flags & HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS) {
             break;
         }
         hloop_process_events(loop);
@@ -342,6 +359,7 @@ int hloop_run(hloop_t* loop) {
     }
     loop->status = HLOOP_STATUS_STOP;
     loop->end_hrtime = gethrtime_us();
+
     if (loop->flags & HLOOP_FLAG_AUTO_FREE) {
         hloop_cleanup(loop);
         HV_FREE(loop);