diff options
Diffstat (limited to 'winsup/cygwin/thread.cc')
-rw-r--r-- | winsup/cygwin/thread.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 9f06c8e3b..11a9d0629 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -44,6 +44,10 @@ details. */ #include <sys/timeb.h> #include <exceptions.h> #include <sys/fcntl.h> +#include <sys/lock.h> + +extern "C" void __fp_lock_all (); +extern "C" void __fp_unlock_all (); extern int threadsafe; @@ -54,6 +58,43 @@ __getreent () return &_my_tls.local_clib; } +extern "C" void +__cygwin_lock_init (_LOCK_T *lock) +{ + *lock = _LOCK_T_INITIALIZER; +} + +extern "C" void +__cygwin_lock_init_recursive (_LOCK_T *lock) +{ + *lock = _LOCK_T_RECURSIVE_INITIALIZER; +} + +extern "C" void +__cygwin_lock_fini (_LOCK_T *lock) +{ + pthread_mutex_destroy ((pthread_mutex_t*) lock); +} + +extern "C" void +__cygwin_lock_lock (_LOCK_T *lock) +{ + pthread_mutex_lock ((pthread_mutex_t*) lock); +} + +extern "C" void +__cygwin_lock_trylock (_LOCK_T *lock) +{ + pthread_mutex_trylock ((pthread_mutex_t*) lock); +} + + +extern "C" void +__cygwin_lock_unlock (_LOCK_T *lock) +{ + pthread_mutex_unlock ((pthread_mutex_t*) lock); +} + inline LPCRITICAL_SECTION ResourceLocks::Lock (int _resid) { @@ -1908,11 +1949,15 @@ pthread::atforkprepare (void) cb->cb (); cb = cb->next; } + + __fp_lock_all (); } void pthread::atforkparent (void) { + __fp_unlock_all (); + callback *cb = MT_INTERFACE->pthread_parent; while (cb) { @@ -1926,6 +1971,8 @@ pthread::atforkchild (void) { MT_INTERFACE->fixup_after_fork (); + __fp_unlock_all (); + callback *cb = MT_INTERFACE->pthread_child; while (cb) { |