diff options
author | Mike Pall <mike> | 2012-06-28 15:47:16 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-06-28 15:47:16 +0200 |
commit | a6458ce4de250fa465cd8de5cd31c48e49ed5977 (patch) | |
tree | 8e8fe4425246abf79c62548568435652150f7284 /src/lib_os.c | |
parent | a751c8a5b566035c83f47c6c59b16da348dc2b1d (diff) | |
download | luajit2-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.gz |
Make os.date() thread-safe.
Diffstat (limited to 'src/lib_os.c')
-rw-r--r-- | src/lib_os.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/lib_os.c b/src/lib_os.c index 38aada67..2412d47b 100644 --- a/src/lib_os.c +++ b/src/lib_os.c @@ -167,13 +167,24 @@ LJLIB_CF(os_date) const char *s = luaL_optstring(L, 1, "%c"); time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); struct tm *stm; +#if LJ_TARGET_POSIX + struct tm rtm; +#endif if (*s == '!') { /* UTC? */ + s++; /* Skip '!' */ +#if LJ_TARGET_POSIX + stm = gmtime_r(&t, &rtm); +#else stm = gmtime(&t); - s++; /* skip `!' */ +#endif } else { +#if LJ_TARGET_POSIX + stm = localtime_r(&t, &rtm); +#else stm = localtime(&t); +#endif } - if (stm == NULL) { /* invalid date? */ + if (stm == NULL) { /* Invalid date? */ setnilV(L->top-1); } else if (strcmp(s, "*t") == 0) { lua_createtable(L, 0, 9); /* 9 = number of fields */ @@ -192,11 +203,11 @@ LJLIB_CF(os_date) cc[0] = '%'; cc[2] = '\0'; luaL_buffinit(L, &b); for (; *s; s++) { - if (*s != '%' || *(s + 1) == '\0') { /* no conversion specifier? */ + if (*s != '%' || *(s + 1) == '\0') { /* No conversion specifier? */ luaL_addchar(&b, *s); } else { size_t reslen; - char buff[200]; /* should be big enough for any conversion result */ + char buff[200]; /* Should be big enough for any conversion result. */ cc[1] = *(++s); reslen = strftime(buff, sizeof(buff), cc, stm); luaL_addlstring(&b, buff, reslen); |