1
0
Эх сурвалжийг харах

adjust time when systemtime changed

ithewei 6 жил өмнө
parent
commit
50c395cffb
3 өөрчлөгдсөн 17 нэмэгдсэн , 8 устгасан
  1. 2 2
      event/hevent.h
  2. 12 4
      event/hloop.c
  3. 3 2
      event/hloop.h

+ 2 - 2
event/hevent.h

@@ -20,8 +20,8 @@ ARRAY_DECL(hio_t*, io_array);
 struct hloop_s {
     uint32_t    flags;
     hloop_status_e status;
-    time_t      start_time; // s
-    uint64_t    start_hrtime; // us
+    uint64_t    start_ms;       // ms
+    uint64_t    start_hrtime;   // us
     uint64_t    end_hrtime;
     uint64_t    cur_hrtime;
     uint64_t    loop_cnt;

+ 12 - 4
event/hloop.c

@@ -169,7 +169,7 @@ static void hloop_init(hloop_t* loop) {
     // iowatcher: init when iowatcher_add_event
     //iowatcher_init(loop);
     // NOTE: init start_time here, because htimer_add use it.
-    time(&loop->start_time);
+    loop->start_ms = timestamp_ms();
     loop->start_hrtime = loop->cur_hrtime = gethrtime();
 }
 
@@ -276,14 +276,22 @@ int hloop_resume(hloop_t* loop) {
 
 void hloop_update_time(hloop_t* loop) {
     loop->cur_hrtime = gethrtime();
+    if (ABS((int64_t)hloop_now(loop) - (int64_t)time(NULL)) > 1) {
+        // systemtime changed, we adjust start_ms
+        loop->start_ms = timestamp_ms() - (loop->cur_hrtime - loop->start_hrtime) / 1000;
+    }
+}
+
+uint64_t hloop_now(hloop_t* loop) {
+    return loop->start_ms / 1000 + (loop->cur_hrtime - loop->start_hrtime) / 1000000;
 }
 
-time_t hloop_now(hloop_t* loop) {
-    return loop->start_time + (loop->cur_hrtime - loop->start_hrtime) / 1000000;
+uint64_t hloop_now_ms(hloop_t* loop) {
+    return loop->start_ms + (loop->cur_hrtime - loop->start_hrtime) / 1000;
 }
 
 uint64_t hloop_now_hrtime(hloop_t* loop) {
-    return loop->start_time*1e6 + (loop->cur_hrtime - loop->start_hrtime);
+    return loop->start_ms * 1000 + (loop->cur_hrtime - loop->start_hrtime);
 }
 
 void  hloop_set_userdata(hloop_t* loop, void* userdata) {

+ 3 - 2
event/hloop.h

@@ -99,8 +99,9 @@ int hloop_pause(hloop_t* loop);
 int hloop_resume(hloop_t* loop);
 
 void     hloop_update_time(hloop_t* loop);
-time_t   hloop_now(hloop_t* loop); // s
-uint64_t hloop_now_hrtime(hloop_t* loop); // us
+uint64_t hloop_now(hloop_t* loop);          // s
+uint64_t hloop_now_ms(hloop_t* loop);       // ms
+uint64_t hloop_now_hrtime(hloop_t* loop);   // us
 
 void  hloop_set_userdata(hloop_t* loop, void* userdata);
 void* hloop_userdata(hloop_t* loop);