--- packaging/source-trees/gt2-cvs/gsi/gss_assist/source/globus_gss_assist_module.c	12 May 2004 22:25:34 -0000	1.7
+++ packaging/source-trees/gt2-cvs/gsi/gss_assist/source/globus_gss_assist_module.c	23 Feb 2005 02:20:58 -0000
@@ -23,6 +23,8 @@
 int                               globus_i_gsi_gss_assist_debug_level = 0;
 FILE *                            globus_i_gsi_gss_assist_debug_fstream = NULL;
 
+globus_mutex_t                    globus_i_gsi_gss_assist_mutex;
+
 /**
  * Module descriptor static initializer.
  */
@@ -80,6 +82,8 @@
     globus_module_activate(GLOBUS_GSI_SYSCONFIG_MODULE);
     globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE);
 
+    globus_mutex_init(&globus_i_gsi_gss_assist_mutex, NULL);
+
  exit:
     GLOBUS_I_GSI_GSS_ASSIST_DEBUG_EXIT;    
     return GLOBUS_SUCCESS;
@@ -97,6 +101,8 @@
     
     GLOBUS_I_GSI_GSS_ASSIST_DEBUG_ENTER;
     
+    globus_mutex_destroy(&globus_i_gsi_gss_assist_mutex);
+
     globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE);
     globus_module_deactivate(GLOBUS_GSI_SYSCONFIG_MODULE);
     globus_module_deactivate(GLOBUS_CALLOUT_MODULE);
--- packaging/source-trees/gt2-cvs/gsi/gss_assist/source/globus_i_gss_assist.h	16 Oct 2003 14:41:03 -0000	1.6
+++ packaging/source-trees/gt2-cvs/gsi/gss_assist/source/globus_i_gss_assist.h	23 Feb 2005 02:20:58 -0000
@@ -22,6 +22,8 @@
 extern int                              globus_i_gsi_gss_assist_debug_level;
 extern FILE *                           globus_i_gsi_gss_assist_debug_fstream;
 
+extern globus_mutex_t                   globus_i_gsi_gss_assist_mutex;
+
 #ifdef BUILD_DEBUG
 
 #define GLOBUS_I_GSI_GSS_ASSIST_DEBUG(_LEVEL_) \
--- packaging/source-trees/gt2-cvs/gsi/gss_assist/source/gridmap.c	14 Oct 2004 10:53:21 -0000	1.14
+++ packaging/source-trees/gt2-cvs/gsi/gss_assist/source/gridmap.c	23 Feb 2005 02:20:58 -0000
@@ -1384,63 +1384,83 @@
 {
     globus_object_t *                   error;
     globus_result_t                     result = GLOBUS_SUCCESS;
-    char *                              filename;
-    globus_callout_handle_t             authz_handle;
+    static globus_bool_t                initialized = GLOBUS_FALSE;
+    static globus_callout_handle_t      authz_handle = NULL;
 
     static char *                       _function_name_ =
         "globus_gss_assist_map_and_authorize";
     
-    result = GLOBUS_GSI_SYSCONFIG_GET_AUTHZ_CONF_FILENAME(&filename);
-    
-    if(result != GLOBUS_SUCCESS)
+    globus_mutex_lock(&globus_i_gsi_gss_assist_mutex);
     {
-        error = globus_error_get(result);
-        
-        if(globus_error_match(
-               error,
-               GLOBUS_GSI_SYSCONFIG_MODULE,
-               GLOBUS_GSI_SYSCONFIG_ERROR_GETTING_AUTHZ_FILENAME)
-           == GLOBUS_TRUE)
+        if(initialized == GLOBUS_FALSE)
         {
-            globus_object_free(error);
-            return globus_l_gss_assist_gridmap_lookup(
-                context,
-                service,
-                desired_identity,
-                identity_buffer,
-                identity_buffer_length);
-        }
-        else
-        {
-            result = globus_error_put(error);
-            return result;
-        }
-    }
-    else
-    {
-        result = globus_callout_handle_init(&authz_handle);
+            char *                      filename;
+            result = GLOBUS_GSI_SYSCONFIG_GET_AUTHZ_CONF_FILENAME(&filename);
             
-        if(result != GLOBUS_SUCCESS)
-        {
-            free(filename);
-            GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
-                result,
-                GLOBUS_GSI_GSS_ASSIST_ERROR_WITH_CALLOUT_CONFIG);
-            goto error;
-        }
+            if(result != GLOBUS_SUCCESS)
+            {
+                error = globus_error_get(result);
+        
+                if(globus_error_match(
+                       error,
+                       GLOBUS_GSI_SYSCONFIG_MODULE,
+                       GLOBUS_GSI_SYSCONFIG_ERROR_GETTING_AUTHZ_FILENAME)
+                   == GLOBUS_TRUE)
+                {
+                    globus_object_free(error);
+                }
+                else
+                {
+                    result = globus_error_put(error);
+                    globus_mutex_unlock(&globus_i_gsi_gss_assist_mutex);
+                    return result;
+                }
+            }
+            else
+            {
+                result = globus_callout_handle_init(&authz_handle);
+            
+                if(result != GLOBUS_SUCCESS)
+                {
+                    free(filename);
+                    GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
+                        result,
+                        GLOBUS_GSI_GSS_ASSIST_ERROR_WITH_CALLOUT_CONFIG);
+                    globus_mutex_unlock(&globus_i_gsi_gss_assist_mutex);
+                    return result;
+                }
             
-        result = globus_callout_read_config(authz_handle, filename);
+                result = globus_callout_read_config(authz_handle, filename);
 
-        free(filename);
+                free(filename);
             
-        if(result != GLOBUS_SUCCESS)
-        {
-            GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
-                result,
-                GLOBUS_GSI_GSS_ASSIST_ERROR_INITIALIZING_CALLOUT_HANDLE);
-            goto destroy_handle;
+                if(result != GLOBUS_SUCCESS)
+                {
+                    GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
+                        result,
+                        GLOBUS_GSI_GSS_ASSIST_ERROR_INITIALIZING_CALLOUT_HANDLE);
+                    globus_callout_handle_destroy(authz_handle);
+                    globus_mutex_unlock(&globus_i_gsi_gss_assist_mutex);
+                    return result;
+                }
+            }
+            initialized = GLOBUS_TRUE;
         }
-            
+    }
+    globus_mutex_unlock(&globus_i_gsi_gss_assist_mutex);
+
+    
+    if(authz_handle == NULL)
+    {
+        return globus_l_gss_assist_gridmap_lookup(
+            context,
+            service,
+            desired_identity,
+            identity_buffer,
+            identity_buffer_length);
+    }
+    else
+    {            
         result = globus_callout_call_type(authz_handle,
                                           GLOBUS_GENERIC_MAPPING_TYPE,
                                           context,
@@ -1466,7 +1486,7 @@
                     desired_identity,
                     identity_buffer,
                     identity_buffer_length);
-                goto destroy_handle;
+                goto error;
             }
             else
             {
@@ -1474,7 +1494,7 @@
                 GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
                     result,
                     GLOBUS_GSI_GSS_ASSIST_CALLOUT_ERROR);
-                goto destroy_handle;
+                goto error;
             }
         }
 
@@ -1496,7 +1516,7 @@
                 GLOBUS_GSI_GSS_ASSIST_ERROR_CHAIN_RESULT(
                     result,
                     GLOBUS_GSI_GSS_ASSIST_CALLOUT_ERROR);
-                goto destroy_handle;
+                goto error;
             }
             else
             {
@@ -1507,8 +1527,7 @@
         }
     }
     
- destroy_handle:
-    globus_callout_handle_destroy(authz_handle);    
+
  error:
     return result;
 }