diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index cfd18bb9a..c0f44a17e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,24 @@ +2004-03-26 Christopher Faylor + + * path.cc (path_conv::check): Use 'strchr' rather than 'strrchr' to + find end of string, for efficiency. + +2004-03-26 Thomas Pfaff + + * include/cygwin/_types.h: New file. + * include/sys/lock.h: Ditto. + * include/sys/stdio.h: Ditto. + * thread.cc: Include sys/lock.h + (__cygwin_lock_init): New function. + (__cygwin_lock_init_recursive): Ditto. + (__cygwin_lock_fini): Ditto. + (__cygwin_lock_lock): Ditto. + (__cygwin_lock_trylock): Ditto. + (__cygwin_lock_unlock): Ditto. + (pthread::atforkprepare): Lock file pointer before fork. + (pthread::atforkparent): Unlock file pointer after fork. + (pthread::atforkchild): Ditto. + 2004-03-26 Corinna Vinschen * sem.cc (semget): Fix debug string. diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 96fa0628c..7ed2ee778 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -495,7 +495,7 @@ path_conv::check (const char *src, unsigned opt, MALLOC_CHECK; assert (src); - char *p = strrchr (src, '\0'); + char *p = strchr (src, '\0'); /* Detect if the user was looking for a directory. We have to strip the trailing slash initially and add it back on at the end due to Windows brain damage. */ 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 #include #include +#include + +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) {