diff --git a/configure.ac b/configure.ac index 4f8dea18..e648afae 100644 --- a/configure.ac +++ b/configure.ac @@ -142,6 +142,13 @@ AC_ARG_ENABLE( [enable_pedantic="no"] ) +AC_ARG_ENABLE( + [thread_locking], + [AS_HELP_STRING([--disable-thread-locking],[disable OS thread locking @<:@enabled@:>@])], + , + [enable_thread_locking="yes"] +) + AC_ARG_ENABLE( [zlib], [AS_HELP_STRING([--enable-zlib],[enable zlib linkage @<:@detect@:>@])], @@ -369,6 +376,10 @@ if test "${WIN32}" = "no"; then CC="${PTHREAD_CC}" fi +if test "${enable_thread_locking}" = "yes"; then + CPPFLAGS="${CPPFLAGS} -DPKCS11_THREAD_LOCKING" +fi + if test "${enable_minidriver}" = "yes"; then dnl win32 special test for minidriver AC_CHECK_HEADER( @@ -638,6 +649,9 @@ if test "${enable_man}" = "yes" -o "${enable_doc}" = "yes"; then fi OPENSC_FEATURES="" +if test "${enable_thread_locking}" = "yes"; then + OPENSC_FEATURES="${OPENSC_FEATURES} locking" +fi if test "${enable_zlib}" = "yes"; then OPENSC_FEATURES="${OPENSC_FEATURES} zlib" OPTIONAL_ZLIB_CFLAGS="${ZLIB_CFLAGS}" @@ -719,6 +733,7 @@ AC_SUBST([PROFILE_DIR]) AC_SUBST([PROFILE_DIR_DEFAULT]) AM_CONDITIONAL([ENABLE_MAN], [test "${enable_man}" = "yes"]) +AM_CONDITIONAL([ENABLE_THREAD_LOCKING], [test "${enable_thread_locking}" = "yes"]) AM_CONDITIONAL([ENABLE_ZLIB], [test "${enable_zlib}" = "yes"]) AM_CONDITIONAL([ENABLE_READLINE], [test "${enable_readline}" = "yes"]) AM_CONDITIONAL([ENABLE_OPENSSL], [test "${enable_openssl}" = "yes"]) @@ -805,6 +820,7 @@ XSL stylesheets: ${xslstylesheetsdir} man support: ${enable_man} doc support: ${enable_doc} +thread locking support: ${enable_thread_locking} zlib support: ${enable_zlib} readline support: ${enable_readline} OpenSSL support: ${enable_openssl} diff --git a/src/pkcs11/pkcs11-global.c b/src/pkcs11/pkcs11-global.c index 4800c437..86922b01 100644 --- a/src/pkcs11/pkcs11-global.c +++ b/src/pkcs11/pkcs11-global.c @@ -26,6 +26,14 @@ #include #endif +#ifdef PKCS11_THREAD_LOCKING +#if defined(HAVE_PTHREAD) +#include +#elif defined(_WIN32) +#include +#endif +#endif /* PKCS11_THREAD_LOCKING */ + #include "sc-pkcs11.h" #ifndef MODULE_APP_NAME @@ -42,8 +50,10 @@ pid_t initialized_pid = (pid_t)-1; static int in_finalize = 0; extern CK_FUNCTION_LIST pkcs11_function_list; -#if defined(HAVE_PTHREAD) && defined(PKCS11_THREAD_LOCKING) -#include +#ifdef PKCS11_THREAD_LOCKING + +#if defined(HAVE_PTHREAD) + CK_RV mutex_create(void **mutex) { pthread_mutex_t *m; @@ -81,7 +91,10 @@ CK_RV mutex_destroy(void *p) static CK_C_INITIALIZE_ARGS _def_locks = { mutex_create, mutex_destroy, mutex_lock, mutex_unlock, 0, NULL }; -#elif defined(_WIN32) && defined (PKCS11_THREAD_LOCKING) +#define HAVE_OS_LOCKING + +#elif defined(_WIN32) + CK_RV mutex_create(void **mutex) { CRITICAL_SECTION *m; @@ -114,14 +127,18 @@ CK_RV mutex_destroy(void *p) free(p); return CKR_OK; } + static CK_C_INITIALIZE_ARGS _def_locks = { mutex_create, mutex_destroy, mutex_lock, mutex_unlock, 0, NULL }; +#define HAVE_OS_LOCKING + #endif +#endif /* PKCS11_THREAD_LOCKING */ + static CK_C_INITIALIZE_ARGS_PTR global_locking; -static void * global_lock = NULL; -#if (defined(HAVE_PTHREAD) || defined(_WIN32)) && defined(PKCS11_THREAD_LOCKING) -#define HAVE_OS_LOCKING +static void *global_lock = NULL; +#ifdef HAVE_OS_LOCKING static CK_C_INITIALIZE_ARGS_PTR default_mutex_funcs = &_def_locks; #else static CK_C_INITIALIZE_ARGS_PTR default_mutex_funcs = NULL;