summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/et/ChangeLog4
-rw-r--r--src/util/et/error_message.c2
-rw-r--r--src/util/support/ChangeLog5
-rw-r--r--src/util/support/threads.c3
4 files changed, 14 insertions, 0 deletions
diff --git a/src/util/et/ChangeLog b/src/util/et/ChangeLog
index eeec13ebd..bec740722 100644
--- a/src/util/et/ChangeLog
+++ b/src/util/et/ChangeLog
@@ -1,3 +1,7 @@
+2005-01-17 Jeffrey Altman <jaltman@mit.edu>
+
+ * error_message.c: implement library unload cleanup of mutexes
+
2005-01-13 Ken Raeburn <raeburn@mit.edu>
* error_message.c (com_err_terminate): Lock the list mutex before
diff --git a/src/util/et/error_message.c b/src/util/et/error_message.c
index 8bef6804d..e60029b5c 100644
--- a/src/util/et/error_message.c
+++ b/src/util/et/error_message.c
@@ -62,6 +62,8 @@ void com_err_terminate(void)
struct dynamic_et_list *e, *enext;
if (! INITIALIZER_RAN(com_err_initialize) || PROGRAM_EXITING())
return;
+ k5_key_delete(K5_KEY_COM_ERR);
+ k5_mutex_destroy(&com_err_hook_lock);
k5_mutex_lock(&et_list_lock);
for (e = et_list_dynamic; e; e = enext) {
enext = e->next;
diff --git a/src/util/support/ChangeLog b/src/util/support/ChangeLog
index 4e0aaa679..010995392 100644
--- a/src/util/support/ChangeLog
+++ b/src/util/support/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-17 Jeffrey Altman <jaltman@mit.edu>
+
+ * threads.c: implement cleanup of static vars on library
+ unload (for Windows)
+
2005-01-14 Ken Raeburn <raeburn@mit.edu>
* threads.c (k5_mutex_lock_update_stats,
diff --git a/src/util/support/threads.c b/src/util/support/threads.c
index 44b64201f..c8d4199d1 100644
--- a/src/util/support/threads.c
+++ b/src/util/support/threads.c
@@ -305,6 +305,9 @@ int k5_key_delete (k5_key_t keynum)
/* XXX Memory leak here!
Need to destroy the associated data for all threads.
But watch for race conditions in case threads are going away too. */
+ assert(destructors_set[keynum] == 1);
+ destructors_set[keynum] = 0;
+ destructors[keynum] = 0;
LeaveCriticalSection(&key_lock);
#else /* POSIX */