summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@samsung.com>2015-01-26 15:48:57 +0100
committerCedric BAIL <cedric@osg.samsung.com>2015-02-16 14:47:48 +0100
commit866ec799b822ff9919f0445630bb1f1a6385904a (patch)
tree1e2bd22ff0689bc060d4939b586ab01c783eaac7
parent1354bb1727b384249b0f73d7dbe82996f0c34552 (diff)
downloadefl-866ec799b822ff9919f0445630bb1f1a6385904a.tar.gz
emile: make it cross platform.
-rw-r--r--src/lib/emile/emile_main.c63
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;