KERBEROS_GSSAPI_LIBS=-lgssapi_krb5
KERBEROS_GSSAPI_CFLAGS=-DNO_GLOBUS_GSSAPI
-GLOBUS_GSSAPI_GSI_LIBS?=${GLOBUS_NOTHR_LIBS} ${GLOBUS_GSSAPI_NOTHR_LIBS}
-GLOBUS_GSSAPI_GSI_CFLAGS?=${GLOBUS_NOTHR_INC}
+GLOBUS_GSSAPI_GSI_LIBS?=${GLOBUS_THR_LIBS} ${GLOBUS_GSSAPI_THR_LIBS}
+GLOBUS_GSSAPI_GSI_CFLAGS?=${GLOBUS_THR_INC}
-GLOBUS_COMMON_LIBS?=${GLOBUS_NOTHR_LIBS}
-GLOBUS_COMMON_CFLAGS?=${GLOBUS_NOTHR_INC}
+GLOBUS_COMMON_LIBS?=${GLOBUS_THR_LIBS}
+GLOBUS_COMMON_CFLAGS?=${GLOBUS_THR_INC}
ifeq ($(gssapi_provider),kerberos)
-GSSAPI_NOTHR_LIBS=${GLOBUS_COMMON_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
-GSSAPI_THR_LIBS=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_LIBS} -lssl
-GSSAPI_THR_INC=${GLOBUS_THR_INC} ${KERBEROS_GSSAPI_CFLAGS}
-GSSAPI_NOTHR_INC=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_CFLAGS}
+GSSAPI_THR_LIBS=${GLOBUS_COMMON_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
+GSSAPI_THR_INC=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_CFLAGS}
+GSSAPI_NOTHR_LIBS=${GLOBUS_NOTHR_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
+GSSAPI_NOTHR_INC=${GLOBUS_NOTHR_INC} ${KERBEROS_GSSAPI_CFLAGS}
else
-GSSAPI_NOTHR_LIBS=${GLOBUS_GSSAPI_GSI_LIBS}
-GSSAPI_THR_LIBS=${GLOBUS_THR_LIBS} ${GLOBUS_GSSAPI_THR_LIBS}
-GSSAPI_THR_INC=${GLOBUS_THR_INC}
-GSSAPI_NOTHR_INC=${GLOBUS_GSSAPI_GSI_CFLAGS}
+GSSAPI_THR_LIBS=${GLOBUS_GSSAPI_GSI_LIBS}
+GSSAPI_THR_INC=${GLOBUS_GSSAPI_GSI_CFLAGS}
+GSSAPI_NOTHR_LIBS=${GLOBUS_NOTHR_LIBS} ${GLOBUS_GSSAPI_NOTHR_LIBS}
+GSSAPI_NOTHR_INC=${GLOBUS_NOTHR_INC}
endif
LIBCARES_CFLAGS?=-I${cares_prefix}/include
ifeq ($(thrflavour),)
-${GSS_STATICLIB}: ${GSS_OBJS}
- ar crv $@ ${GSS_OBJS}
+${GSS_STATICLIB}: ${GSS_THROBJS}
+ ar crv $@ ${GSS_THROBJS}
ranlib $@
-${GSS_LTLIB}: ${GSS_OBJS}
- ${LINK} ${version_info} -o $@ ${GSS_LOBJS} ${GSSAPI_NOTHR_LIBS} ${LIBCARES_LIBS}
+${GSS_LTLIB}: ${GSS_THROBJS}
+ ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS} -lpthread
else
${GSS_NOTHRSTATICLIB}: ${GSS_OBJS}
ar crv $@ ${GSS_OBJS}
${LINK} ${version_info} -o $@ ${GSS_LOBJS} ${GSSAPI_NOTHR_LIBS} ${LIBCARES_LIBS}
${GSS_THRLTLIB}: ${GSS_THROBJS}
- ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS}
+ ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS} -lpthread
endif
${COMPILE} ${GSSAPI_NOTHR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
%.thr.o: %.c
- ${COMPILE} ${GSSAPI_THR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
+ ${COMPILE} -D_REENTRANT -DGLITE_LBU_THREADED ${GSSAPI_THR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
test_gss.o: %.o: %.cpp
${CXX} -c ${CFLAGS} ${GLOBUS_GSSAPI_GSI_CFLAGS} ${CPPUNIT_CFLAGS} -Wno-error $<
#include <ares.h>
#include <ares_version.h>
#include <errno.h>
+#ifdef GLITE_LBU_THREADED
+#include <pthread.h>
+#endif
#include <globus_common.h>
};
static int globus_common_activated = 0;
+#ifdef GLITE_LBU_THREADED
+static pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
typedef struct gssapi_mech {
const char* name;
do { /* XXX: the black magic above */
while (!context_established) {
+#ifdef GLITE_LBU_THREADED
+ /* XXX: gss_init_sec_context() not thread-safe? */
+ pthread_mutex_lock(&init_lock);
+#endif
/* XXX verify ret_flags match what was requested */
maj_stat = gss_init_sec_context(&min_stat, gss_cred, &context,
target, mech,
0, GSS_C_NO_CHANNEL_BINDINGS,
&input_token, NULL, &output_token,
NULL, NULL);
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_unlock(&init_lock);
+#endif
if (input_token.length > 0) {
free(input_token.value);
input_token.length = 0;
{
int ret = 0;
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_lock(&init_lock);
+#endif
if (!getenv("GLOBUS_THREAD_MODEL")) {
putenv("GLOBUS_THREAD_MODEL=pthread");
}
if (globus_module_activate(GLOBUS_COMMON_MODULE) == GLOBUS_SUCCESS)
globus_common_activated = 1;
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_unlock(&init_lock);
+#endif
return ret;
}
void
edg_wll_gss_finalize(void)
{
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_lock(&init_lock);
+#endif
#ifndef NO_GLOBUS_GSSAPI
globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE);
#endif
globus_module_deactivate(GLOBUS_COMMON_MODULE);
globus_common_activated = 0;
}
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_unlock(&init_lock);
+#endif
}
{
int ret;
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_lock(&init_lock);
+#endif
if (globus_common_activated)
ret = globus_libc_gethostname(name, len);
else
ret = gethostname(name, len);
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_unlock(&init_lock);
+#endif
return ret;
}
int ret;
intptr_t signum2;
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_lock(&init_lock);
+#endif
if (!globus_common_activated) {
struct sigaction sa,osa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = handler_func;
ret = sigaction(signum, &sa, &osa);
- return ret;
- }
-
- signum2 = signum;
- ret = globus_callback_space_register_signal_handler(signum,
+ } else {
+ signum2 = signum;
+ ret = globus_callback_space_register_signal_handler(signum,
GLOBUS_TRUE,
(globus_callback_func_t)handler_func,
(void *)signum2,
GLOBUS_CALLBACK_GLOBAL_SPACE);
+ }
+#ifdef GLITE_LBU_THREADED
+ pthread_mutex_unlock(&init_lock);
+#endif
return ret;
}