X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Finit_globals.c;h=786cb9c3425b74874ac46d8be11b2d3ad9228716;hb=917d2c4a288a19c0da7fa98ad514288d0e045413;hp=81301e2db2aba5d3307f5f61e83c65962aaefc4d;hpb=f516f94ad6cc3f11275e9dec04c9c523591b7a23;p=yaz-moved-to-github.git diff --git a/src/init_globals.c b/src/init_globals.c index 81301e2..786cb9c 100644 --- a/src/init_globals.c +++ b/src/init_globals.c @@ -12,9 +12,12 @@ #include #endif +#include + #if YAZ_POSIX_THREADS #include #endif +#include #if HAVE_GNUTLS_H #include @@ -24,27 +27,92 @@ #include #endif +#if YAZ_HAVE_XML2 +#include +#endif + +#if YAZ_HAVE_XSLT +#include +#endif + +#if YAZ_HAVE_EXSLT +#include +#endif + static int yaz_init_flag = 0; +#if YAZ_POSIX_THREADS +static pthread_mutex_t yaz_init_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif extern void yaz_log_init_globals(void); +#if HAVE_GCRYPT_H +GCRY_THREAD_OPTION_PTHREAD_IMPL; +#endif + void yaz_init_globals(void) { + if (yaz_init_flag) + return; +#if YAZ_POSIX_THREADS + pthread_mutex_lock(&yaz_init_mutex); +#endif if (!yaz_init_flag) { - yaz_init_flag = 1; yaz_log_init_globals(); +#if HAVE_GCRYPT_H + /* POSIX threads locking. In case gnutls_global_init do not override */ + gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); +#endif #if HAVE_GNUTLS_H gnutls_global_init(); #endif #if HAVE_GCRYPT_H - /* most likely, GnuTLS has initialized libgcrypt */ + /* most likely, GnuTLS has already initialized libgcrypt */ if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0) { gcry_control(GCRYCTL_INITIALIZATION_FINISHED, NULL, 0); } #endif +#if YAZ_HAVE_XML2 + xmlInitParser(); +#endif +#if YAZ_HAVE_XSLT + xsltInit(); +#endif +#if YAZ_HAVE_EXSLT + exsltRegisterAll(); +#endif + yaz_init_flag = 1; /* must be last, before unlocking */ } +#if YAZ_POSIX_THREADS + pthread_mutex_unlock(&yaz_init_mutex); +#endif +} + +void yaz_deinit_globals(void) +{ + if (!yaz_init_flag) + return; +#if YAZ_POSIX_THREADS + pthread_mutex_lock(&yaz_init_mutex); +#endif + if (yaz_init_flag) + { +#if HAVE_GNUTLS_H + gnutls_global_deinit(); +#endif +#if YAZ_HAVE_XSLT + xsltCleanupGlobals(); +#endif +#if YAZ_HAVE_XML2 + xmlCleanupParser(); +#endif + yaz_init_flag = 0; + } +#if YAZ_POSIX_THREADS + pthread_mutex_unlock(&yaz_init_mutex); +#endif } /*