CCAPI should only use one pthread key
authorAlexandra Ellwood <lxs@mit.edu>
Thu, 4 Sep 2008 18:43:14 +0000 (18:43 +0000)
committerAlexandra Ellwood <lxs@mit.edu>
Thu, 4 Sep 2008 18:43:14 +0000 (18:43 +0000)
Use k5 thread functions.  Also add destructors so if we ever have a way
to detect application exit that the pthread key is destroyed.

ticket: new

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20705 dc483132-0cff-0310-8789-dd5450dbe970

src/ccapi/lib/ccapi_context.c
src/ccapi/lib/ccapi_context_change_time.c
src/ccapi/lib/ccapi_context_change_time.h
src/ccapi/lib/ccapi_ipc.c
src/ccapi/lib/ccapi_ipc.h
src/ccapi/lib/ccapi_os_ipc.h
src/ccapi/lib/mac/ccapi_os_ipc.c
src/ccapi/lib/win/ccapi_os_ipc.cxx
src/include/k5-thread.h

index 3b8d60e3eb700f16df6ded5f7eeab619451d75ec..640e153e8c20540ed85a6082675784031f5d2c9b 100644 (file)
@@ -80,6 +80,7 @@ static cc_int32 cci_context_sync (cci_context_t in_context,
 #endif
 
 MAKE_INIT_FUNCTION(cci_thread_init);
+MAKE_FINI_FUNCTION(cci_thread_fini);
 
 /* ------------------------------------------------------------------------ */
 
@@ -98,6 +99,19 @@ static int cci_thread_init (void)
     return err;
 }
 
+/* ------------------------------------------------------------------------ */
+
+static void cci_thread_fini (void)
+{
+    if (!INITIALIZER_RAN (cci_thread_init) || PROGRAM_EXITING ()) {
+       return;
+    }
+    
+    cci_context_change_time_thread_fini ();
+    cci_ipc_thread_fini ();
+}
+
+
 #ifdef TARGET_OS_MAC
 #pragma mark -
 #endif
index f701c22fefcfd1e73b3396b688cb1e1945b412e2..4efc7db6039b2a199c437b16e8ed1159012f282e 100644 (file)
@@ -41,6 +41,13 @@ cc_int32 cci_context_change_time_thread_init (void)
     return k5_mutex_finish_init(&g_change_time_mutex);
 }
 
+/* ------------------------------------------------------------------------ */
+
+void cci_context_change_time_thread_fini (void)
+{
+    k5_mutex_destroy(&g_change_time_mutex);
+}
+
 /* ------------------------------------------------------------------------ */
 /* WARNING!  Mutex must be locked when calling this!                        */
 
index 536c492d88103cc8a3a0081fa162c6af16096e2c..ecf3583a945297ac30b1440d5454f28a1b56b5b3 100644 (file)
@@ -30,6 +30,7 @@
 #include "cci_common.h"
 
 cc_int32 cci_context_change_time_thread_init (void);
+void cci_context_change_time_thread_fini (void);
 
 cc_int32 cci_context_change_time_get (cc_time_t *out_change_time);
 
index 4d2e4314d5111d82bf064541c2f31199a42cffcf..fe541db4eb628823f9a76aa2d7b0417b57214894 100644 (file)
@@ -36,6 +36,13 @@ cc_int32 cci_ipc_thread_init (void)
 
 /* ------------------------------------------------------------------------ */
 
+void cci_ipc_thread_fini (void)
+{
+    cci_os_ipc_thread_fini ();
+}
+
+/* ------------------------------------------------------------------------ */
+
 static cc_int32 _cci_ipc_send (enum cci_msg_id_t  in_request_name,
                                cc_int32           in_launch_server,
                                cci_identifier_t   in_identifier,
index 73c5b249726614df9ae51b05cbc9ff29af5a0ec6..2ba7637ac6c1809759298a81f3bd574b3f0d0608 100644 (file)
@@ -30,6 +30,7 @@
 #include "cci_common.h"
 
 cc_int32 cci_ipc_thread_init (void);
+void cci_ipc_thread_fini (void);
 
 cc_int32 cci_ipc_send (enum cci_msg_id_t  in_request_name,
                        cci_identifier_t   in_identifier,
index d9eb79f1c375f28ef7f7d544dfc93a4aca28fbd2..0121adadb767f1c08e3f8bc7c6dcb20226578b8d 100644 (file)
@@ -30,6 +30,7 @@
 #include "cci_common.h"
 
 cc_int32 cci_os_ipc_thread_init (void);
+void cci_os_ipc_thread_fini (void);
 
 cc_int32 cci_os_ipc (cc_int32      in_launch_server,
                      cci_stream_t  in_request_stream,
index 2fabb192209868f301aa7bee88e1719003187f4d..d51e4c321a15c879e4e3556f7f647ae30bc5c1e6 100644 (file)
 #define cci_server_bundle_id "edu.mit.Kerberos.CCacheServer"
 #define cci_server_path "/System/Library/CoreServices/CCacheServer.app/Contents/MacOS/CCacheServer"
 
-static pthread_key_t g_request_port_key = 0;
-static pthread_key_t g_reply_stream_key = 0;
-static pthread_key_t g_server_died_key = 0;
-
 /* ------------------------------------------------------------------------ */
 
 cc_int32 cci_os_ipc_thread_init (void)
 {
     cc_int32 err = ccNoError;
 
-    err = pthread_key_create (&g_request_port_key, free);
+    err = k5_key_register (K5_KEY_CCAPI_REQUEST_PORT, free);
     
     if (!err) {
-        err = pthread_key_create (&g_reply_stream_key, NULL);
+        err = k5_key_register (K5_KEY_CCAPI_REPLY_STREAM, NULL);
     }
     
     if (!err) {
-        err = pthread_key_create (&g_server_died_key, NULL);
+        err = k5_key_register (K5_KEY_CCAPI_SERVER_DIED, NULL);
     }
     
     return err;
 }
 
+/* ------------------------------------------------------------------------ */
+
+void cci_os_ipc_thread_fini (void)
+{    
+    k5_key_delete (K5_KEY_CCAPI_REQUEST_PORT);
+    k5_key_delete (K5_KEY_CCAPI_REPLY_STREAM);
+    k5_key_delete (K5_KEY_CCAPI_SERVER_DIED);
+}
+
 #pragma mark -
 
 /* ------------------------------------------------------------------------ */
@@ -67,7 +72,7 @@ static boolean_t cci_server_demux (mach_msg_header_t *request,
     boolean_t handled = false;
     
     if (!handled && request->msgh_id == MACH_NOTIFY_NO_SENDERS) {
-        cc_int32 *server_died = pthread_getspecific (g_server_died_key);
+        cc_int32 *server_died = k5_getspecific (K5_KEY_CCAPI_SERVER_DIED);
         if (!server_died) { 
             *server_died = 1;
         }
@@ -94,7 +99,7 @@ kern_return_t cci_mipc_reply (mach_port_t             in_reply_port,
     cci_stream_t reply_stream = NULL;
     
     if (!err) {
-        reply_stream = pthread_getspecific (g_reply_stream_key);
+        reply_stream = k5_getspecific (K5_KEY_CCAPI_REPLY_STREAM);
         if (!reply_stream) { err = cci_check_error (ccErrBadInternalMessage); }
     }
     
@@ -161,7 +166,7 @@ cc_int32 cci_os_ipc (cc_int32      in_launch_server,
     }
 
     if (!err) {
-        request_port = pthread_getspecific (g_request_port_key);
+        request_port = k5_getspecific (K5_KEY_CCAPI_REQUEST_PORT);
         
         if (!request_port) {
             request_port = malloc (sizeof (mach_port_t));
@@ -169,7 +174,7 @@ cc_int32 cci_os_ipc (cc_int32      in_launch_server,
             
             if (!err) {
                 *request_port = MACH_PORT_NULL;
-                err = pthread_setspecific (g_request_port_key, request_port);
+                err = k5_setspecific (K5_KEY_CCAPI_REQUEST_PORT, request_port);
             }
         }
     }
@@ -226,11 +231,11 @@ cc_int32 cci_os_ipc (cc_int32      in_launch_server,
     }
     
     if (!err) {
-        err = pthread_setspecific (g_reply_stream_key, reply_stream);
+        err = k5_setspecific (K5_KEY_CCAPI_REPLY_STREAM, reply_stream);
     }
     
     if (!err) {
-        err = pthread_setspecific (g_server_died_key, &server_died);
+        err = k5_setspecific (K5_KEY_CCAPI_SERVER_DIED, &server_died);
     }
     
     if (!err) {
@@ -265,8 +270,8 @@ cc_int32 cci_os_ipc (cc_int32      in_launch_server,
         reply_stream = NULL;
     }
     
-    pthread_setspecific (g_reply_stream_key, NULL);
-    pthread_setspecific (g_server_died_key, NULL);
+    k5_setspecific (K5_KEY_CCAPI_REPLY_STREAM, NULL);
+    k5_setspecific (K5_KEY_CCAPI_SERVER_DIED, NULL);
     if (reply_port != MACH_PORT_NULL) { mach_port_destroy (mach_task_self (), reply_port); }
     if (ool_request_length          ) { vm_deallocate (mach_task_self (), (vm_address_t) ool_request, ool_request_length); }
     if (reply_stream                ) { cci_stream_release (reply_stream); }
index 617598b77bcb56e0a98d96fcae6907d9b2ceb504..4b00e2de388fad41088e905a465d6377cb4108dd 100644 (file)
@@ -118,6 +118,13 @@ extern "C" cc_int32 cci_os_ipc_thread_init (void) {
     }
 
 
+/* ------------------------------------------------------------------------ */
+
+void cci_os_ipc_thread_fini (void)
+{    
+}
+
+
 /* ------------------------------------------------------------------------ */
 
 cc_int32 cci_os_ipc (cc_int32      in_launch_server,
index 0450eb277d46590a462e85cc0c69cb496c045fa4..ad1ad8b73a70fd380586c802e2e945d8b53c250e 100644 (file)
@@ -410,6 +410,11 @@ typedef enum {
     K5_KEY_GSS_KRB5_CCACHE_NAME,
     K5_KEY_GSS_KRB5_ERROR_MESSAGE,
     K5_KEY_KIM_ERROR_MESSAGE,
+#if defined(__MACH__) && defined(__APPLE__)
+    K5_KEY_CCAPI_REQUEST_PORT,
+    K5_KEY_CCAPI_REPLY_STREAM,
+    K5_KEY_CCAPI_SERVER_DIED,
+#endif
     K5_KEY_MAX
 } k5_key_t;
 /* rename shorthand symbols for export */