diff --git a/lualib-src/lua-skynet.c b/lualib-src/lua-skynet.c index 7d75d2ce..063320a4 100644 --- a/lualib-src/lua-skynet.c +++ b/lualib-src/lua-skynet.c @@ -326,6 +326,13 @@ ltrash(lua_State *L) { return 0; } +static int +lnow(lua_State *L) { + uint64_t ti = skynet_now(); + lua_pushinteger(L, ti); + return 1; +} + int luaopen_skynet_core(lua_State *L) { luaL_checkversion(L); @@ -344,6 +351,7 @@ luaopen_skynet_core(lua_State *L) { { "packstring", lpackstring }, { "trash" , ltrash }, { "callback", _callback }, + { "now", lnow }, { NULL, NULL }, }; diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 0bc2d6e9..4a101004 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -299,16 +299,19 @@ function skynet.localname(name) end end -function skynet.now() - return c.intcommand("NOW") -end +skynet.now = c.now + +local starttime function skynet.starttime() - return c.intcommand("STARTTIME") + if not starttime then + starttime = c.intcommand("STARTTIME") + end + return starttime end function skynet.time() - return skynet.now()/100 + skynet.starttime() -- get now first would be better + return skynet.now()/100 + starttime or skynet.starttime() end function skynet.exit() diff --git a/skynet-src/skynet.h b/skynet-src/skynet.h index fc8235e0..26df5ac6 100644 --- a/skynet-src/skynet.h +++ b/skynet-src/skynet.h @@ -38,5 +38,6 @@ typedef int (*skynet_cb)(struct skynet_context * context, void *ud, int type, in void skynet_callback(struct skynet_context * context, void *ud, skynet_cb cb); uint32_t skynet_current_handle(void); +uint64_t skynet_now(void); #endif diff --git a/skynet-src/skynet_log.c b/skynet-src/skynet_log.c index 65b97c30..4ce106ff 100644 --- a/skynet-src/skynet_log.c +++ b/skynet-src/skynet_log.c @@ -15,11 +15,11 @@ skynet_log_open(struct skynet_context * ctx, uint32_t handle) { sprintf(tmp, "%s/%08x.log", logpath, handle); FILE *f = fopen(tmp, "ab"); if (f) { - uint32_t starttime = skynet_gettime_fixsec(); - uint32_t currenttime = skynet_gettime(); + uint32_t starttime = skynet_starttime(); + uint64_t currenttime = skynet_now(); time_t ti = starttime + currenttime/100; skynet_error(ctx, "Open log file %s", tmp); - fprintf(f, "open time: %u %s", currenttime, ctime(&ti)); + fprintf(f, "open time: %u %s", (uint32_t)currenttime, ctime(&ti)); fflush(f); } else { skynet_error(ctx, "Open log file %s fail", tmp); @@ -30,7 +30,7 @@ skynet_log_open(struct skynet_context * ctx, uint32_t handle) { void skynet_log_close(struct skynet_context * ctx, FILE *f, uint32_t handle) { skynet_error(ctx, "Close log file :%08x", handle); - fprintf(f, "close time: %u\n", skynet_gettime()); + fprintf(f, "close time: %u\n", (uint32_t)skynet_now()); fclose(f); } @@ -68,7 +68,7 @@ skynet_log_output(FILE *f, uint32_t source, int type, int session, void * buffer if (type == PTYPE_SOCKET) { log_socket(f, buffer, sz); } else { - uint32_t ti = skynet_gettime(); + uint32_t ti = (uint32_t)skynet_now(); fprintf(f, ":%08x %d %d %u ", source, type, session, ti); log_blob(f, buffer, sz); fprintf(f,"\n"); diff --git a/skynet-src/skynet_server.c b/skynet-src/skynet_server.c index 64258a92..f5d7f6bd 100644 --- a/skynet-src/skynet_server.c +++ b/skynet-src/skynet_server.c @@ -429,13 +429,6 @@ cmd_name(struct skynet_context * context, const char * param) { return NULL; } -static const char * -cmd_now(struct skynet_context * context, const char * param) { - uint32_t ti = skynet_gettime(); - sprintf(context->result,"%u",ti); - return context->result; -} - static const char * cmd_exit(struct skynet_context * context, const char * param) { handle_exit(context, 0); @@ -507,7 +500,7 @@ cmd_setenv(struct skynet_context * context, const char * param) { static const char * cmd_starttime(struct skynet_context * context, const char * param) { - uint32_t sec = skynet_gettime_fixsec(); + uint32_t sec = skynet_starttime(); sprintf(context->result,"%u",sec); return context->result; } @@ -619,7 +612,6 @@ static struct command_func cmd_funcs[] = { { "REG", cmd_reg }, { "QUERY", cmd_query }, { "NAME", cmd_name }, - { "NOW", cmd_now }, { "EXIT", cmd_exit }, { "KILL", cmd_kill }, { "LAUNCH", cmd_launch }, diff --git a/skynet-src/skynet_timer.c b/skynet-src/skynet_timer.c index 1f366b85..182b808d 100644 --- a/skynet-src/skynet_timer.c +++ b/skynet-src/skynet_timer.c @@ -45,10 +45,9 @@ struct timer { struct link_list t[4][TIME_LEVEL]; struct spinlock lock; uint32_t time; - uint32_t current; uint32_t starttime; + uint64_t current; uint64_t current_point; - uint64_t origin_point; }; static struct timer * TI = NULL; @@ -277,13 +276,7 @@ skynet_updatetime(void) { } else if (cp != TI->current_point) { uint32_t diff = (uint32_t)(cp - TI->current_point); TI->current_point = cp; - - uint32_t oc = TI->current; TI->current += diff; - if (TI->current < oc) { - // when cs > 0xffffffff(about 497 days), time rewind - TI->starttime += 0xffffffff / 100; - } int i; for (i=0;istarttime; } -uint32_t -skynet_gettime(void) { +uint64_t +skynet_now(void) { return TI->current; } void skynet_timer_init(void) { TI = timer_create_timer(); - systime(&TI->starttime, &TI->current); - uint64_t point = gettime(); - TI->current_point = point; - TI->origin_point = point; + uint32_t current = 0; + systime(&TI->starttime, ¤t); + TI->current = current; + TI->current_point = gettime(); } diff --git a/skynet-src/skynet_timer.h b/skynet-src/skynet_timer.h index 4d4e2b0f..b278dbcb 100644 --- a/skynet-src/skynet_timer.h +++ b/skynet-src/skynet_timer.h @@ -5,8 +5,7 @@ int skynet_timeout(uint32_t handle, int time, int session); void skynet_updatetime(void); -uint32_t skynet_gettime(void); -uint32_t skynet_gettime_fixsec(void); +uint32_t skynet_starttime(void); void skynet_timer_init(void);