diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 12 | ||||
-rw-r--r-- | winsup/cygwin/thread.cc | 13 | ||||
-rw-r--r-- | winsup/cygwin/thread.h | 2 |
3 files changed, 23 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e3d8786..591dcfc 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2002-09-27 Robert Collins <rbtcollins@hotmail.com> + + * thread.cc (pthread_key::run_destructor): Run_destructor is not + const as it needs to set the key value. + * thread.h (pthread_key::run_destructor): Ditto. + +2002-09-27 Robert Collins <rbtcollins@hotmail.com> + + * thread.cc (pthread_key::run_destructor): Follow opengroup algorithm. + I.e. only run the destructor NON-NULL key values, and reset the key + to NULL before running the destructor. Reported by Thomas Pfaff. + 2002-09-25 Christopher Faylor <cgf@redhat.com> * cygrun.c (main): Fix setting of CYGWIN environment variable. diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 3ee11f1..6b05cff 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -1035,10 +1035,17 @@ pthread_key::recreateKeyFromBuffer () } void -pthread_key::run_destructor () const +pthread_key::run_destructor () { - if (destructor) - destructor (get ()); + if (destructor) + { + void *oldValue = get(); + if (oldValue) + { + set (NULL); + destructor (oldValue); + } + } } /*pshared mutexs: diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index c364660..4be0bf1 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -212,7 +212,7 @@ private: void saveKeyToBuffer (); void recreateKeyFromBuffer (); void (*destructor) (void *); - void run_destructor () const; + void run_destructor (); void *fork_buf; }; |