eet: use eina_lock.

SVN revision: 59378
This commit is contained in:
Cedric BAIL 2011-05-14 09:07:51 +00:00
parent 3e6e8f0f08
commit 20566e914b
5 changed files with 47 additions and 279 deletions

View File

@ -331,22 +331,6 @@ fi
AC_MSG_CHECKING(whether to activate signature support in eet) AC_MSG_CHECKING(whether to activate signature support in eet)
AC_MSG_RESULT(${have_signature}) AC_MSG_RESULT(${have_signature})
# pthread library
EFL_CHECK_THREADS(["no"],
[
if test "x${_efl_have_posix_threads}" = "xyes" ; then
have_threads="POSIX"
else
if test "x${_efl_have_win32_threads}" = "xyes" ; then
have_threads="Win32"
else
have_threads="no"
fi
fi],
[have_threads="no"])
### Checks for header files ### Checks for header files
AC_CHECK_HEADER([zlib.h], AC_CHECK_HEADER([zlib.h],
@ -472,7 +456,6 @@ if test "x${have_gnutls}" = "xyes" || test "x${have_openssl}" = "xyes" ; then
echo " Cipher support.....: ${have_cipher}" echo " Cipher support.....: ${have_cipher}"
echo " Signature..........: ${have_signature}" echo " Signature..........: ${have_signature}"
fi fi
echo " Thread Support.......: ${have_threads}"
echo echo
echo " Old eet file format..: ${old_eet_file_format}" echo " Old eet file format..: ${old_eet_file_format}"
echo echo

View File

@ -1,189 +0,0 @@
dnl Copyright (C) 2010 Vincent Torri <vtorri at univ-evry dot fr>
dnl That code is public domain and can be freely used or copied.
dnl Macro that check if POSIX or Win32 threads library is available or not.
dnl Usage: EFL_CHECK_THREADS(want_pthread_spin[, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Call AC_SUBST(EFL_PTHREAD_CFLAGS)
dnl Call AC_SUBST(EFL_PTHREAD_LIBS)
dnl Define EFL_HAVE_POSIX_THREADS or EFL_HAVE_WIN32_THREADS, and EFL_HAVE_THREADS
dnl Define EFL_HAVE_POSIX_THREADS_SPINLOCK
AC_DEFUN([EFL_CHECK_THREADS],
[
dnl configure option
AC_ARG_ENABLE([posix-threads],
[AC_HELP_STRING([--disable-posix-threads], [enable POSIX threads code @<:@default=auto@:>@])],
[
if test "x${enableval}" = "xyes" ; then
_efl_enable_posix_threads="yes"
else
_efl_enable_posix_threads="no"
fi
],
[_efl_enable_posix_threads="auto"])
AC_MSG_CHECKING([whether to build POSIX threads code])
AC_MSG_RESULT([${_efl_enable_posix_threads}])
AC_ARG_ENABLE([win32-threads],
[AC_HELP_STRING([--disable-win32-threads], [enable Win32 threads code @<:@default=no@:>@])],
[
if test "x${enableval}" = "xyes" ; then
_efl_enable_win32_threads="yes"
else
_efl_enable_win32_threads="no"
fi
],
[_efl_enable_win32_threads="no"])
AC_MSG_CHECKING([whether to build Windows threads code])
AC_MSG_RESULT([${_efl_enable_win32_threads}])
dnl
dnl * no + no
dnl * yes + no : win32: error, other : pthread
dnl * yes + yes : win32 : wthread, other : pthread
dnl * no + yes : win32 : wthread, other : error
if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_enable_win32_threads}" = "xyes" ; then
case "$host_os" in
mingw*)
_efl_enable_posix_threads=no
;;
*)
_efl_enable_win32_threads=no
;;
esac
fi
if test "x${_efl_enable_win32_threads}" = "xyes" ; then
case "$host_os" in
mingw*)
;;
*)
AC_MSG_ERROR([Win32 threads support requested but non Windows system found.])
;;
esac
fi
if test "x${_efl_enable_posix_threads}" = "xyes" ; then
case "$host_os" in
mingw*)
AC_MSG_ERROR([POSIX threads support requested but Windows system found.])
;;
*)
;;
esac
fi
dnl check if the compiler supports POSIX threads
case "$host_os" in
mingw*)
;;
solaris*)
_efl_threads_cflags="-mt"
_efl_threads_libs="-mt"
;;
*)
_efl_threads_cflags="-pthread"
_efl_threads_libs="-pthread"
;;
esac
_efl_have_posix_threads="no"
_efl_have_win32_threads="no"
if test "x${_efl_enable_posix_threads}" = "xyes" || test "x${_efl_enable_posix_threads}" = "xauto" ; then
SAVE_CFLAGS=${CFLAGS}
CFLAGS="${CFLAGS} ${_efl_threads_cflags}"
SAVE_LIBS=${LIBS}
LIBS="${LIBS} ${_efl_threads_libs}"
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([[
#include <pthread.h>
]],
[[
pthread_t id;
id = pthread_self();
]])],
[_efl_have_posix_threads="yes"],
[_efl_have_posix_threads="no"])
CFLAGS=${SAVE_CFLAGS}
LIBS=${SAVE_LIBS}
fi
AC_MSG_CHECKING([whether system support POSIX threads])
AC_MSG_RESULT([${_efl_have_posix_threads}])
if test "$x{_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads}" = "xno"; then
AC_MSG_ERROR([POSIX threads support requested but not found.])
fi
EFL_PTHREAD_CFLAGS=""
EFL_PTHREAD_LIBS=""
if test "x${_efl_have_posix_threads}" = "xyes" ; then
EFL_PTHREAD_CFLAGS=${_efl_threads_cflags}
EFL_PTHREAD_LIBS=${_efl_threads_libs}
fi
AC_SUBST(EFL_PTHREAD_CFLAGS)
AC_SUBST(EFL_PTHREAD_LIBS)
if test "x${_efl_have_posix_threads}" = "xyes" ; then
AC_DEFINE([EFL_HAVE_POSIX_THREADS], [1], [Define to mention that POSIX threads are supported])
fi
dnl check if the compiler supports pthreads spinlock
_efl_have_posix_threads_spinlock="no"
if test "x${_efl_have_posix_threads}" = "xyes" && test "x$1" = "xyes" ; then
SAVE_CFLAGS=${CFLAGS}
CFLAGS="${CFLAGS} ${EFL_PTHREAD_CFLAGS}"
SAVE_LIBS=${LIBS}
LIBS="${LIBS} ${EFL_PTHREAD_LIBS}"
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([[
#include <pthread.h>
]],
[[
pthread_spinlock_t lock;
int res;
res = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
]])],
[_efl_have_posix_threads_spinlock="yes"],
[_efl_have_posix_threads_spinlock="no"])
CFLAGS=${SAVE_CFLAGS}
LIBS=${SAVE_LIBS}
fi
AC_MSG_CHECKING([whether to build POSIX threads spinlock code])
AC_MSG_RESULT([${_efl_have_posix_threads_spinlock}])
if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads_spinlock}" = "xno" && test "x$1" = "xyes" ; then
AC_MSG_WARN([POSIX threads support requested but spinlocks are not supported])
fi
if test "x${_efl_have_posix_threads_spinlock}" = "xyes" ; then
AC_DEFINE([EFL_HAVE_POSIX_THREADS_SPINLOCK], [1], [Define to mention that POSIX threads spinlocks are supported])
fi
if test "x${_efl_enable_win32_threads}" = "xyes" ; then
_efl_have_win32_threads="yes"
AC_DEFINE([EFL_HAVE_WIN32_THREADS], [1], [Define to mention that Win32 threads are supported])
fi
if test "x${_efl_have_posix_threads}" = "xyes" || test "x${_efl_have_win32_threads}" = "xyes" ; then
AC_DEFINE([EFL_HAVE_THREADS], [1], [Define to mention that POSIX or Win32 threads are supported])
fi
AS_IF([test "x$_efl_have_posix_threads" = "xyes" || test "x$_efl_have_win32_threads" = "xyes"], [$2], [$3])
AS_IF([test "x$_efl_have_posix_threads_spinlock" = "xyes"], [$4], [$5])
])

View File

@ -150,9 +150,9 @@ else
libeet_la_SOURCES = $(base_sources) libeet_la_SOURCES = $(base_sources)
endif endif
libeet_la_CFLAGS = @EET_CFLAGS@ @DEBUG_CFLAGS@ @EFL_PTHREAD_CFLAGS@ libeet_la_CFLAGS = @EET_CFLAGS@ @DEBUG_CFLAGS@
libeet_la_LIBADD = @GNUTLS_LIBS@ @OPENSSL_LIBS@ @EFL_COVERAGE_LIBS@ @EET_LIBS@ @EINA_LIBS@ @EVIL_LIBS@ -lz -ljpeg -lm libeet_la_LIBADD = @GNUTLS_LIBS@ @OPENSSL_LIBS@ @EFL_COVERAGE_LIBS@ @EET_LIBS@ @EINA_LIBS@ @EVIL_LIBS@ -lz -ljpeg -lm
libeet_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ @EFL_PTHREAD_LIBS@ libeet_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
EXTRA_DIST = Eet_private.h EXTRA_DIST = Eet_private.h

View File

@ -46,6 +46,8 @@ void * alloca (size_t);
# include <Evil.h> # include <Evil.h>
#endif /* ifdef HAVE_EVIL */ #endif /* ifdef HAVE_EVIL */
#include <Eina.h>
#ifdef HAVE_GNUTLS #ifdef HAVE_GNUTLS
# include <gnutls/gnutls.h> # include <gnutls/gnutls.h>
# include <gcrypt.h> # include <gcrypt.h>
@ -56,14 +58,11 @@ void * alloca (size_t);
# include <openssl/evp.h> # include <openssl/evp.h>
#endif /* ifdef HAVE_OPENSSL */ #endif /* ifdef HAVE_OPENSSL */
#ifdef EFL_HAVE_POSIX_THREADS #ifdef EINA_HAVE_THREADS
# include <pthread.h>
# ifdef HAVE_GNUTLS # ifdef HAVE_GNUTLS
GCRY_THREAD_OPTION_PTHREAD_IMPL; GCRY_THREAD_OPTION_PTHREAD_IMPL;
# endif /* ifdef HAVE_GNUTLS */ # endif /* ifdef HAVE_GNUTLS */
#endif /* ifdef EFL_HAVE_POSIX_THREADS */ #endif /* ifdef EINA_HAVE_THREADS */
#include <Eina.h>
#include "Eet.h" #include "Eet.h"
#include "Eet_private.h" #include "Eet_private.h"
@ -108,13 +107,7 @@ struct _Eet_File
time_t mtime; time_t mtime;
#ifdef EFL_HAVE_THREADS Eina_Lock file_lock;
# ifdef EFL_HAVE_POSIX_THREADS
pthread_mutex_t file_lock;
# else /* ifdef EFL_HAVE_POSIX_THREADS */
HANDLE file_lock;
# endif /* ifdef EFL_HAVE_POSIX_THREADS */
#endif /* ifdef EFL_HAVE_THREADS */
unsigned char writes_pending : 1; unsigned char writes_pending : 1;
unsigned char delete_me_now : 1; unsigned char delete_me_now : 1;
@ -244,45 +237,15 @@ static int read_data_from_disk(Eet_File *ef,
static Eet_Error eet_internal_close(Eet_File *ef, Eina_Bool locked); static Eet_Error eet_internal_close(Eet_File *ef, Eina_Bool locked);
#ifdef EFL_HAVE_THREADS static Eina_Lock eet_cache_lock;
# ifdef EFL_HAVE_POSIX_THREADS #define LOCK_CACHE eina_lock_take(&eet_cache_lock)
#define UNLOCK_CACHE eina_lock_release(&eet_cache_lock)
static pthread_mutex_t eet_cache_lock = PTHREAD_MUTEX_INITIALIZER; #define INIT_FILE(File) eina_lock_new(&File->file_lock)
#define LOCK_FILE(File) eina_lock_take(&File->file_lock)
# define LOCK_CACHE pthread_mutex_lock(&eet_cache_lock) #define UNLOCK_FILE(File) eina_lock_release(&File->file_lock)
# define UNLOCK_CACHE pthread_mutex_unlock(&eet_cache_lock) #define DESTROY_FILE(File) eina_lock_free(&File->file_lock)
# define INIT_FILE(File) pthread_mutex_init(&File->file_lock, NULL)
# define LOCK_FILE(File) pthread_mutex_lock(&File->file_lock)
# define UNLOCK_FILE(File) pthread_mutex_unlock(&File->file_lock)
# define DESTROY_FILE(File) pthread_mutex_destroy(&File->file_lock)
# else /* EFL_HAVE_WIN32_THREADS */
static HANDLE eet_cache_lock = NULL;
# define LOCK_CACHE WaitForSingleObject(eet_cache_lock, INFINITE)
# define UNLOCK_CACHE ReleaseMutex(eet_cache_lock)
# define INIT_FILE(File) File->file_lock = CreateMutex(NULL, FALSE, NULL)
# define LOCK_FILE(File) WaitForSingleObject(File->file_lock, INFINITE)
# define UNLOCK_FILE(File) ReleaseMutex(File->file_lock)
# define DESTROY_FILE(File) CloseHandle(File->file_lock)
# endif /* EFL_HAVE_WIN32_THREADS */
#else /* ifdef EFL_HAVE_THREADS */
# define LOCK_CACHE do {} while (0)
# define UNLOCK_CACHE do {} while (0)
# define INIT_FILE(File) do {} while (0)
# define LOCK_FILE(File) do {} while (0)
# define UNLOCK_FILE(File) do {} while (0)
# define DESTROY_FILE(File) do {} while (0)
#endif /* EFL_HAVE_THREADS */
/* cache. i don't expect this to ever be large, so arrays will do */ /* cache. i don't expect this to ever be large, so arrays will do */
static int eet_writers_num = 0; static int eet_writers_num = 0;
@ -717,6 +680,8 @@ eet_init(void)
goto shutdown_eina; goto shutdown_eina;
} }
eina_lock_new(&eet_cache_lock);
if (!eet_node_init()) if (!eet_node_init())
{ {
EINA_LOG_ERR("Eet: Eet_Node mempool creation failed"); EINA_LOG_ERR("Eet: Eet_Node mempool creation failed");
@ -743,12 +708,12 @@ eet_init(void)
"BIG FAT WARNING: I AM UNABLE TO REQUEST SECMEM, Cryptographic operation are at risk !"); "BIG FAT WARNING: I AM UNABLE TO REQUEST SECMEM, Cryptographic operation are at risk !");
} }
# ifdef EFL_HAVE_POSIX_THREADS # ifdef EINA_HAVE_THREADS
if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread)) if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread))
WRN( WRN(
"YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!"); "YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!");
# endif /* ifdef EFL_HAVE_POSIX_THREADS */ # endif /* ifdef EINA_HAVE_THREADS */
if (gnutls_global_init()) if (gnutls_global_init())
goto shutdown_eet; goto shutdown_eet;
@ -762,7 +727,7 @@ eet_init(void)
#ifdef HAVE_GNUTLS #ifdef HAVE_GNUTLS
shutdown_eet: shutdown_eet:
#endif #endif
eet_node_shutdown(); eet_node_shutdown();
unregister_log_domain: unregister_log_domain:
eina_log_domain_unregister(_eet_log_dom_global); eina_log_domain_unregister(_eet_log_dom_global);
@ -780,6 +745,9 @@ eet_shutdown(void)
eet_clearcache(); eet_clearcache();
eet_node_shutdown(); eet_node_shutdown();
eina_lock_free(&eet_cache_lock);
#ifdef HAVE_GNUTLS #ifdef HAVE_GNUTLS
gnutls_global_deinit(); gnutls_global_deinit();
#endif /* ifdef HAVE_GNUTLS */ #endif /* ifdef HAVE_GNUTLS */

View File

@ -11,14 +11,17 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#ifdef EFL_HAVE_POSIX_THREADS #include <Eina.h>
#ifdef EINA_HAVE_THREADS
#if ((!defined(_WIN32_WCE)) && (!defined(_WIN32)))
# include <pthread.h> # include <pthread.h>
#endif /* ifdef EFL_HAVE_POSIX_THREADS */ # define _EET_INCLUDED_PTHREAD
#endif
#endif /* ifdef EINA_HAVE_THREADS */
#include <check.h> #include <check.h>
#include <Eina.h>
#include "eet_suite.h" #include "eet_suite.h"
START_TEST(eet_test_init) START_TEST(eet_test_init)
@ -1838,11 +1841,11 @@ START_TEST(eet_cipher_decipher_simple)
END_TEST END_TEST
#ifdef EFL_HAVE_THREADS #ifdef EINA_HAVE_THREADS
static Eina_Bool open_worker_stop; static Eina_Bool open_worker_stop;
# ifdef EFL_HAVE_POSIX_THREADS # ifdef _EET_INCLUDED_PTHREAD
static void * static void *
open_close_worker(void * path) open_close_worker(void * path)
@ -1863,7 +1866,7 @@ open_close_worker(void * path)
pthread_exit(NULL); pthread_exit(NULL);
} /* open_close_worker */ } /* open_close_worker */
# else /* ifdef EFL_HAVE_POSIX_THREADS */ # else /* ifdef _EET_INCLUDED_PTHREAD */
static unsigned int __stdcall static unsigned int __stdcall
open_close_worker(void * path) open_close_worker(void * path)
@ -1884,7 +1887,7 @@ open_close_worker(void * path)
_endthreadex(0); _endthreadex(0);
} /* open_close_worker */ } /* open_close_worker */
# endif /* ifdef EFL_HAVE_POSIX_THREADS */ # endif /* ifdef _EET_INCLUDED_PTHREAD */
START_TEST(eet_cache_concurrency) START_TEST(eet_cache_concurrency)
{ {
@ -1893,15 +1896,16 @@ START_TEST(eet_cache_concurrency)
Eet_File * ef; Eet_File * ef;
void * thread_ret; void * thread_ret;
unsigned int n; unsigned int n;
# ifdef EFL_HAVE_POSIX_THREADS # ifdef _EET_INCLUDED_PTHREAD
pthread_t thread; pthread_t thread;
# else /* ifdef EFL_HAVE_POSIX_THREADS */ # else /* ifdef _EET_INCLUDED_PTHREAD */
uintptr_t thread; uintptr_t thread;
unsigned int thread_id; unsigned int thread_id;
DWORD ret; DWORD ret;
# endif /* ifdef EFL_HAVE_POSIX_THREADS */ # endif /* ifdef _EET_INCLUDED_PTHREAD */
eet_init(); eet_init();
eina_threads_init();
/* create a file to test with */ /* create a file to test with */
fail_if(!(file = tmpnam(file))); fail_if(!(file = tmpnam(file)));
@ -1911,11 +1915,11 @@ START_TEST(eet_cache_concurrency)
/* start a thread that repeatedly opens and closes a file */ /* start a thread that repeatedly opens and closes a file */
open_worker_stop = 0; open_worker_stop = 0;
# ifdef EFL_HAVE_POSIX_THREADS # ifdef _EET_INCLUDED_PTHREAD
pthread_create(&thread, NULL, open_close_worker, file); pthread_create(&thread, NULL, open_close_worker, file);
# else /* ifdef EFL_HAVE_POSIX_THREADS */ # else /* ifdef _EET_INCLUDED_PTHREAD */
thread = _beginthreadex(NULL, 0, open_close_worker, file, 0, &thread_id); thread = _beginthreadex(NULL, 0, open_close_worker, file, 0, &thread_id);
# endif /* ifdef EFL_HAVE_POSIX_THREADS */ # endif /* ifdef _EET_INCLUDED_PTHREAD */
/* clear the cache repeatedly in this thread */ /* clear the cache repeatedly in this thread */
for (n = 0; n < 50000; ++n) for (n = 0; n < 50000; ++n)
{ {
@ -1924,22 +1928,24 @@ START_TEST(eet_cache_concurrency)
/* join the other thread, and fail if it returned an error message */ /* join the other thread, and fail if it returned an error message */
open_worker_stop = 1; open_worker_stop = 1;
# ifdef EFL_HAVE_POSIX_THREADS # ifdef _EET_INCLUDED_PTHREAD
fail_if(pthread_join(thread, &thread_ret) != 0); fail_if(pthread_join(thread, &thread_ret) != 0);
fail_unless(thread_ret == NULL, (char const *)thread_ret); fail_unless(thread_ret == NULL, (char const *)thread_ret);
# else /* ifdef EFL_HAVE_POSIX_THREADS */ # else /* ifdef _EET_INCLUDED_PTHREAD */
ret = WaitForSingleObject((HANDLE)thread, INFINITE); ret = WaitForSingleObject((HANDLE)thread, INFINITE);
fail_if(ret != WAIT_OBJECT_0); fail_if(ret != WAIT_OBJECT_0);
fail_if(GetExitCodeThread((HANDLE)thread, &ret) == FALSE); fail_if(GetExitCodeThread((HANDLE)thread, &ret) == FALSE);
fail_if(ret != 0); fail_if(ret != 0);
# endif /* ifdef EFL_HAVE_POSIX_THREADS */ # endif /* ifdef _EET_INCLUDED_PTHREAD */
fail_if(unlink(file) != 0); fail_if(unlink(file) != 0);
eina_threads_shutdown();
eet_shutdown(); eet_shutdown();
} }
END_TEST END_TEST
#endif /* EFL_HAVE_THREADS */ #endif /* EINA_HAVE_THREADS */
typedef struct _Eet_Connection_Data Eet_Connection_Data; typedef struct _Eet_Connection_Data Eet_Connection_Data;
struct _Eet_Connection_Data struct _Eet_Connection_Data
@ -2716,7 +2722,7 @@ eet_suite(void)
suite_add_tcase(s, tc); suite_add_tcase(s, tc);
#endif /* ifdef HAVE_CIPHER */ #endif /* ifdef HAVE_CIPHER */
#ifdef EFL_HAVE_THREADS #ifdef EINA_HAVE_THREADS
tc = tcase_create("Eet Cache"); tc = tcase_create("Eet Cache");
tcase_add_test(tc, eet_cache_concurrency); tcase_add_test(tc, eet_cache_concurrency);
suite_add_tcase(s, tc); suite_add_tcase(s, tc);