Browse thread
Unix.localtime not threadsafe?
- Yaron Minsky
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2005-09-02 (17:34) |
From: | Yaron Minsky <yminsky@g...> |
Subject: | Unix.localtime not threadsafe? |
I was looking at the Unix.localtime implementation, and it appears to me that it's not threadsafe. I'm wondering if anyone can confirm. First off, the underlying localtime call is definitely not re-entrant. The tm data structure is shared among all calls, leading to the possibility of races. What I'm not sure of is whether there can be a race given the locking of the OCaml runtime. Here's the code from gmtime.c in the ocaml distribution: static value alloc_tm(struct tm *tm) { value res; res = alloc_small(9, 0); Field(res,0) = Val_int(tm->tm_sec); Field(res,1) = Val_int(tm->tm_min); Field(res,2) = Val_int(tm->tm_hour); Field(res,3) = Val_int(tm->tm_mday); Field(res,4) = Val_int(tm->tm_mon); Field(res,5) = Val_int(tm->tm_year); Field(res,6) = Val_int(tm->tm_wday); Field(res,7) = Val_int(tm->tm_yday); Field(res,8) = tm->tm_isdst ? Val_true : Val_false; return res; } CAMLprim value unix_localtime(value t) { time_t clock; struct tm * tm; clock = (time_t) Double_val(t); tm = localtime(&clock); if (tm == NULL) unix_error(EINVAL, "localtime", Nothing); return alloc_tm(tm); } If I understand the way ocaml's locking works, another thread could make a call to localtime where alloc_small is called. If there are mixed C threads and Ocaml threads, then a call by the C thread at that point could muck up the tm data structure before switching back to OCaml, thus leading to bad data getting into the tm data structure. So, does this seem like a going bug? We think we may have encountered this in the wild, so this may be more than a theoretical bug. Yaron