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 | |
| parent | a751c8a5b566035c83f47c6c59b16da348dc2b1d (diff) | |
| download | luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.gz luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.bz2 luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.zip | |
Make os.date() thread-safe.
| -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); |
