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 | luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.gz luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.bz2 luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.zip |
Make os.date() thread-safe.
Diffstat (limited to '')
-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) | |||
167 | const char *s = luaL_optstring(L, 1, "%c"); | 167 | const char *s = luaL_optstring(L, 1, "%c"); |
168 | time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); | 168 | time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); |
169 | struct tm *stm; | 169 | struct tm *stm; |
170 | #if LJ_TARGET_POSIX | ||
171 | struct tm rtm; | ||
172 | #endif | ||
170 | if (*s == '!') { /* UTC? */ | 173 | if (*s == '!') { /* UTC? */ |
174 | s++; /* Skip '!' */ | ||
175 | #if LJ_TARGET_POSIX | ||
176 | stm = gmtime_r(&t, &rtm); | ||
177 | #else | ||
171 | stm = gmtime(&t); | 178 | stm = gmtime(&t); |
172 | s++; /* skip `!' */ | 179 | #endif |
173 | } else { | 180 | } else { |
181 | #if LJ_TARGET_POSIX | ||
182 | stm = localtime_r(&t, &rtm); | ||
183 | #else | ||
174 | stm = localtime(&t); | 184 | stm = localtime(&t); |
185 | #endif | ||
175 | } | 186 | } |
176 | if (stm == NULL) { /* invalid date? */ | 187 | if (stm == NULL) { /* Invalid date? */ |
177 | setnilV(L->top-1); | 188 | setnilV(L->top-1); |
178 | } else if (strcmp(s, "*t") == 0) { | 189 | } else if (strcmp(s, "*t") == 0) { |
179 | lua_createtable(L, 0, 9); /* 9 = number of fields */ | 190 | lua_createtable(L, 0, 9); /* 9 = number of fields */ |
@@ -192,11 +203,11 @@ LJLIB_CF(os_date) | |||
192 | cc[0] = '%'; cc[2] = '\0'; | 203 | cc[0] = '%'; cc[2] = '\0'; |
193 | luaL_buffinit(L, &b); | 204 | luaL_buffinit(L, &b); |
194 | for (; *s; s++) { | 205 | for (; *s; s++) { |
195 | if (*s != '%' || *(s + 1) == '\0') { /* no conversion specifier? */ | 206 | if (*s != '%' || *(s + 1) == '\0') { /* No conversion specifier? */ |
196 | luaL_addchar(&b, *s); | 207 | luaL_addchar(&b, *s); |
197 | } else { | 208 | } else { |
198 | size_t reslen; | 209 | size_t reslen; |
199 | char buff[200]; /* should be big enough for any conversion result */ | 210 | char buff[200]; /* Should be big enough for any conversion result. */ |
200 | cc[1] = *(++s); | 211 | cc[1] = *(++s); |
201 | reslen = strftime(buff, sizeof(buff), cc, stm); | 212 | reslen = strftime(buff, sizeof(buff), cc, stm); |
202 | luaL_addlstring(&b, buff, reslen); | 213 | luaL_addlstring(&b, buff, reslen); |