summaryrefslogtreecommitdiff
path: root/src/lib_os.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-06-28 15:47:16 +0200
committerMike Pall <mike>2012-06-28 15:47:16 +0200
commita6458ce4de250fa465cd8de5cd31c48e49ed5977 (patch)
tree8e8fe4425246abf79c62548568435652150f7284 /src/lib_os.c
parenta751c8a5b566035c83f47c6c59b16da348dc2b1d (diff)
downloadluajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.gz
luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.tar.bz2
luajit-a6458ce4de250fa465cd8de5cd31c48e49ed5977.zip
Make os.date() thread-safe.
Diffstat (limited to '')
-rw-r--r--src/lib_os.c19
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);