gnutls_audit_log_func _gnutls_audit_log_func = NULL;
int _gnutls_log_level = 0; /* default log level */
+static int _gnutls_global_init(unsigned constructor);
+static void _gnutls_global_deinit(unsigned destructor);
+
static void default_log_func(int level, const char* str)
{
fprintf(stderr, "gnutls[%d]: %s", level, str);
* otherwise a negative error code is returned.
**/
int gnutls_global_init(void)
+{
+ return _gnutls_global_init(0);
+}
+
+static int _gnutls_global_init(unsigned constructor)
{
int ret = 0, res;
int level;
const char* e;
-
- GNUTLS_STATIC_MUTEX_LOCK(global_init_mutex);
+
+ if (!constructor) {
+ GNUTLS_STATIC_MUTEX_LOCK(global_init_mutex);
+ }
_gnutls_init++;
if (_gnutls_init > 1) {
out:
_gnutls_init_ret = ret;
- GNUTLS_STATIC_MUTEX_UNLOCK(global_init_mutex);
+ if (!constructor) {
+ GNUTLS_STATIC_MUTEX_UNLOCK(global_init_mutex);
+ }
return ret;
}
static void _gnutls_global_deinit(unsigned destructor)
{
- GNUTLS_STATIC_MUTEX_LOCK(global_init_mutex);
+ if (!destructor) {
+ GNUTLS_STATIC_MUTEX_LOCK(global_init_mutex);
+ }
if (_gnutls_init == 1) {
_gnutls_init = 0;
}
fail:
- GNUTLS_STATIC_MUTEX_UNLOCK(global_init_mutex);
+ if (!destructor) {
+ GNUTLS_STATIC_MUTEX_UNLOCK(global_init_mutex);
+ }
}
/**
return;
}
- ret = gnutls_global_init();
+ ret = _gnutls_global_init(1);
if (ret < 0) {
fprintf(stderr, "Error in GnuTLS initialization: %s\n", gnutls_strerror(ret));
_gnutls_switch_lib_state(LIB_STATE_ERROR);