diff options
author | Cedric BAIL <cedric.bail@samsung.com> | 2015-01-26 15:48:57 +0100 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2015-02-16 14:47:48 +0100 |
commit | 866ec799b822ff9919f0445630bb1f1a6385904a (patch) | |
tree | 1e2bd22ff0689bc060d4939b586ab01c783eaac7 | |
parent | 1354bb1727b384249b0f73d7dbe82996f0c34552 (diff) | |
download | efl-866ec799b822ff9919f0445630bb1f1a6385904a.tar.gz |
emile: make it cross platform.
-rw-r--r-- | src/lib/emile/emile_main.c | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/src/lib/emile/emile_main.c b/src/lib/emile/emile_main.c index 63f1c5aa8a..2e137d2009 100644 --- a/src/lib/emile/emile_main.c +++ b/src/lib/emile/emile_main.c @@ -19,20 +19,71 @@ #include "Emile.h" #include "emile_private.h" -#ifdef HAVE_GNUTLS -GCRY_THREAD_OPTION_PTHREAD_IMPL; -#endif /* ifdef HAVE_GNUTLS */ - static Eina_Bool _emile_cipher_init = EINA_FALSE; static unsigned int _emile_init_count = 0; int _emile_log_dom_global = -1; +#ifdef HAVE_GNUTLS +static int +_emile_thread_mutex_init(void **priv) +{ + Eina_Lock *lock; + + lock = malloc(sizeof (Eina_Lock)); + if (!lock) return ENOMEM; + + if (!eina_lock_new(lock)) + { + free(lock); + return ENOMEM; + } + + *priv = lock; + return 0; +} + +static int +_emile_thread_mutex_destroy(void **priv) +{ + eina_lock_free(*priv); + free(*priv); + return 0; +} + +static int +_emile_thread_mutex_lock(void **priv) +{ + if (eina_lock_take(*priv) == EINA_LOCK_FAIL) + return EINVAL; + return 0; +} + +static int +_emile_thread_mutex_unlock(void **priv) +{ + if (eina_lock_release(*priv) == EINA_LOCK_FAIL) + return EINVAL; + return 0; +} + +static struct gcry_thread_cbs _emile_threads = { + (GCRY_THREAD_OPTION_PTHREAD | (GCRY_THREAD_OPTION_VERSION << 8)), + NULL, _emile_thread_mutex_init, _emile_thread_mutex_destroy, + _emile_thread_mutex_lock, _emile_thread_mutex_unlock, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; +#endif /* ifdef HAVE_GNUTLS */ + EAPI Eina_Bool emile_cipher_init(void) { if (_emile_cipher_init) return EINA_TRUE; #ifdef HAVE_GNUTLS + if (gcry_control(GCRYCTL_SET_THREAD_CBS, &_emile_threads)) + WRN( + "YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!"); + /* Before the library can be used, it must initialize itself if needed. */ if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0) { @@ -52,10 +103,6 @@ emile_cipher_init(void) "BIG FAT WARNING: I AM UNABLE TO REQUEST SECMEM, Cryptographic operation are at risk !"); } - if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread)) - WRN( - "YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!"); - if (gnutls_global_init()) return EINA_FALSE; |