mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 12:20:41 +00:00
@@ -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
22
test/time.lua
Normal 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)
|
||||||
Reference in New Issue
Block a user