Merge pull request #127 from xjdrew/real_bugfix_time

Real bugfix time
This commit is contained in:
云风
2014-06-25 11:00:01 +08:00
2 changed files with 62 additions and 26 deletions

View File

@@ -48,6 +48,8 @@ struct timer {
int time; int time;
uint32_t current; uint32_t current;
uint32_t starttime; uint32_t starttime;
uint64_t current_point;
uint64_t origin_point;
}; };
static struct timer * TI = NULL; static struct timer * TI = NULL;
@@ -218,29 +220,50 @@ skynet_timeout(uint32_t handle, int time, int session) {
return session; return session;
} }
static uint32_t // centisecond: 1/100 second
_gettime(void) { static void
uint32_t t; _systime(uint32_t *sec, uint32_t *cs) {
#if !defined(__APPLE__) #if !defined(__APPLE__)
struct timespec ti; struct timespec ti;
clock_gettime(CLOCK_MONOTONIC, &ti); clock_gettime(CLOCK_REALTIME, &ti);
t = (uint32_t)(ti.tv_sec & 0xffffff) * 100; *sec = (uint32_t)ti.tv_sec;
t += ti.tv_nsec / 10000000; *cs = (uint32_t)(ti.tv_nsec / 10000000);
#else #else
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
t = (uint32_t)(tv.tv_sec & 0xffffff) * 100; *sec = tv.tv_sec;
t += tv.tv_usec / 10000; *cs = tv.tv_usec / 10000;
#endif
}
static uint64_t
_gettime() {
uint64_t t;
#if !defined(__APPLE__)
struct timespec ti;
clock_gettime(CLOCK_MONOTONIC, &ti);
t = ti.tv_sec * 100;
t += (uint32_t)(ti.tv_nsec / 10000000);
#else
struct timeval tv;
gettimeofday(&tv, NULL);
t = ti.tv_sec * 100;
t += (uint32_t)(tv.tv_usec / 10000);
#endif #endif
return t; return t;
} }
void void
skynet_updatetime(void) { skynet_updatetime(void) {
uint32_t ct = _gettime(); uint64_t cp = _gettime();
if (ct != TI->current) { if(cp < TI->current_point) {
int diff = ct>=TI->current?ct-TI->current:(0xffffff+1)*100-TI->current+ct; skynet_error(NULL, "time diff error: change from %lld to %lld", cp, TI->current_point);
TI->current = ct; } else if (cp != TI->current_point) {
uint32_t diff = (uint32_t)(cp - TI->current_point);
TI->current_point = cp;
// when cs > 0xffffffff(about 49710), time rewind
TI->current += diff;
int i; int i;
for (i=0;i<diff;i++) { for (i=0;i<diff;i++) {
timer_update(TI); timer_update(TI);
@@ -261,18 +284,9 @@ skynet_gettime(void) {
void void
skynet_timer_init(void) { skynet_timer_init(void) {
TI = timer_create_timer(); TI = timer_create_timer();
TI->current = _gettime(); _systime(&TI->starttime, &TI->current);
uint64_t point = _gettime();
#if !defined(__APPLE__) TI->current_point = point;
struct timespec ti; TI->origin_point = point;
clock_gettime(CLOCK_REALTIME, &ti);
uint32_t sec = (uint32_t)ti.tv_sec;
#else
struct timeval tv;
gettimeofday(&tv, NULL);
uint32_t sec = (uint32_t)tv.tv_sec;
#endif
uint32_t mono = _gettime() / 100;
TI->starttime = sec - mono;
} }

22
test/time.lua Normal file
View File

@@ -0,0 +1,22 @@
local skynet = require "skynet"
skynet.start(function()
print(skynet.starttime())
print(skynet.now())
skynet.timeout(1, function()
print("in 1", skynet.now())
end)
skynet.timeout(2, function()
print("in 2", skynet.now())
end)
skynet.timeout(3, function()
print("in 3", skynet.now())
end)
skynet.timeout(4, function()
print("in 4", skynet.now())
end)
skynet.timeout(100, function()
print("in 100", skynet.now())
end)
end)