lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Thu, Jun 11, 2009 at 11:54 PM, Asko Kauppi<> wrote:
> The re-entrant gmtime_r() and localtime_r() are not ANSI C, I believe. You
> can provide a patch but inclusion of non-ANSI C features has seemed to be a
> 'no'. Maybe this will change, eventually.
> "The asctime_r(), ctime_r(), gmtime_r(), and localtime_r() functions are
> expected to conform to ISO/IEC 9945-1:1996 (``POSIX.1'')"

right, indeed gmtime_r/localtime_r would fall under LUA_USE_POSIX

from solaris localtime manpage,

     The asctime(), ctime(), gmtime(), and localtime()  functions
     are  safe  to  use  in multithread applications because they
     employ  thread-specific  data.   However,   their   use   is
     discouraged  because  standards  do  not  require them to be

from linux (ubuntu) localtime manpage,

       The four functions asctime(), ctime(), gmtime() and localtime()  return
       a  pointer  to  static data and hence are not thread-safe.  Thread-safe
       versions asctime_r(), ctime_r(), gmtime_r() and localtime_r() are spec‐
       ified by SUSv2, and available since libc 5.2.5.

so gmtime/localtime are not required to be thread-safe by the standard
... but some vendors have made them thread-safe.

> Can you post a case where using such functions really presents a hazard, in
> a multithreaded application?

of course, I will try to put together an example that breaks for you.
The idea would be to have two or more threads with their own lua
state; and at the same time, have one writing to the static data the
other reading from it.

> Why do you think 'system' is a problem?  Maybe it's been on the warning list
> because when you launch external programs, there's no guarantee how
> multithread unfriendly they could be? I find no problem with 'system()'
> itself.

from solaris system(3c) man page,

     The system() function manipulates the  signal  handlers  for
     SIGINT,  SIGQUIT,  and  SIGCHLD. It is therefore not safe to
     call system() in a multithreaded process, since  some  other
     thread  that  manipulates these signal handlers and a thread
     that concurrently calls system()  can  interfere  with  each
     other  in  a destructive manner.  If, however, no such other
     thread is active, system() can safely be called concurrently
     from  multiple  threads. See popen(3C) for an alternative to
     system() that is thread-safe.

they suggest,

       int my_system(const char *cmd)
              FILE *p;

              if ((p = popen(cmd, "w")) == NULL)
                      return (-1);
              return (pclose(p));

as a system() alternative.