diff options
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/time/tzlock.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/newlib/libc/time/tzlock.c b/newlib/libc/time/tzlock.c index 66fa1c366..f3c289620 100644 --- a/newlib/libc/time/tzlock.c +++ b/newlib/libc/time/tzlock.c @@ -17,13 +17,14 @@ TRAD_SYNOPSIS void __tz_unlock(); DESCRIPTION -The <<tzset>> facility functions call these functions when they need -to ensure the values of global variables. The version of these routines supplied -in the library do not do anything. If multiple threads of execution -can call the time functions and give up scheduling in the middle, then you -you need to define your own versions of these functions in order to -safely lock the time zone variables during a call. If you do not, the results -of <<localtime>>, <<mktime>>, <<ctime>>, and <<strftime>> are undefined. +The <<tzset>> facility functions call these functions when they need to +ensure the values of global variables. The version of these routines +supplied in the library use the lock API defined in sys/lock.h. If multiple +threads of execution can call the time functions and give up scheduling in +the middle, then you you need to define your own versions of these functions +in order to safely lock the time zone variables during a call. If you do +not, the results of <<localtime>>, <<mktime>>, <<ctime>>, and <<strftime>> +are undefined. The lock <<__tz_lock>> may not be called recursively; that is, a call <<__tz_lock>> will always lock all subsequent <<__tz_lock>> calls @@ -32,13 +33,24 @@ until the corresponding <<__tz_unlock>> call on the same thread is made. #include <_ansi.h> #include "local.h" +#include <sys/lock.h> + +#ifndef __SINGLE_THREAD__ +__LOCK_INIT(static, __tz_lock_object); +#endif _VOID _DEFUN_VOID (__tz_lock) { +#ifndef __SINGLE_THREAD__ + __lock_acquire(__tz_lock_object); +#endif } _VOID _DEFUN_VOID (__tz_unlock) { +#ifndef __SINGLE_THREAD__ + __lock_release(__tz_lock_object); +#endif } |