diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e3d8786cb..591dcfc30 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2002-09-27 Robert Collins + + * 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 + + * 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 * cygrun.c (main): Fix setting of CYGWIN environment variable. diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 3ee11f1e9..6b05cffb2 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 c36466020..4be0bf14d 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; };