[MINOR] introduce now_ms, the current date in milliseconds
This new time value will be used to compute timeouts and wait queue
positions. The operation is made once for all when time is retrieved.
A future improvement might consist in having it in ticks of 1/1024
second and to convert all timeouts into ticks.
diff --git a/include/common/time.h b/include/common/time.h
index 82ec402..7dbed6d 100644
--- a/include/common/time.h
+++ b/include/common/time.h
@@ -54,6 +54,7 @@
#define MINTIME(old, new) (((new)<0)?(old):(((old)<0||(new)<(old))?(new):(old)))
#define SETNOW(a) (*a=now)
+extern unsigned int now_ms; /* internal date in milliseconds (may wrap) */
extern struct timeval now; /* internal date is a monotonic function of real clock */
extern struct timeval date; /* the real current date */
extern struct timeval start_date; /* the process's start date */
diff --git a/src/time.c b/src/time.c
index f637f6c..5318dcd 100644
--- a/src/time.c
+++ b/src/time.c
@@ -16,6 +16,7 @@
#include <common/standard.h>
#include <common/time.h>
+unsigned int now_ms; /* internal date in milliseconds (may wrap) */
struct timeval now; /* internal date is a monotonic function of real clock */
struct timeval date; /* the real current date */
struct timeval start_date; /* the process's start date */
@@ -162,7 +163,7 @@
if (unlikely(max_wait < 0)) {
tv_zero(&tv_offset);
now = date;
- return;
+ goto to_ms;
}
__tv_add(&adjusted, &date, &tv_offset);
if (unlikely(__tv_islt(&adjusted, &now))) {
@@ -178,7 +179,7 @@
goto fixup; /* jump in the future */
}
now = adjusted;
- return;
+ goto to_ms;
fixup:
/* Large jump. If the poll was interrupted, we consider that the date
* has not changed (immediate wake-up), otherwise we add the poll
@@ -192,6 +193,8 @@
tv_offset.tv_usec += 1000000;
tv_offset.tv_sec--;
}
+ to_ms:
+ now_ms = now.tv_sec * 1000 + now.tv_usec / 1000;
return;
}