From: "Sung W. Park" <sungwoo@gmail.com>
authorSung W. Park <sungwoo@gmail.com>
Mon, 17 Oct 2011 05:06:01 +0000 (05:06 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 17 Oct 2011 05:06:01 +0000 (05:06 +0000)
"... I've created a resource context per thread using TLS.  Since there is no
TLS support in Eina, I've added 4 APIs for that as well.  Another patch has
been submitted but i'll just include it in here as well. ..."

SVN revision: 64120

legacy/eina/AUTHORS
legacy/eina/src/include/eina_inline_lock_posix.x
legacy/eina/src/include/eina_inline_lock_void.x
legacy/eina/src/include/eina_inline_lock_win32.x
legacy/eina/src/include/eina_inline_lock_wince.x
legacy/eina/src/include/eina_lock.h

index 354de527af9f7d48ebd402e79b4191fe7f498e63..148327071716adca68be3d17baf3707a7f51d481 100644 (file)
@@ -19,3 +19,4 @@ Sebastian Dransfeld <sd@tango.flipp.net>
 Myungjae Lee <mjae.lee@samsung.com>
 Youness Alaoui <kakaroto@kakaroto.homelinux.net>
 billiob (Boris Faure) <billiob@gmail.com>
+Sung W. Park <sungwoo@gmail.com>
index 2da5bfcc08a87f665554d5635851ebbd4befbee1..77f5b8b4ed3718239d459ed74536493d417b53fb 100644 (file)
@@ -44,6 +44,7 @@ typedef void (*Eina_Lock_Bt_Func) ();
 typedef struct _Eina_Lock Eina_Lock;
 typedef struct _Eina_RWLock Eina_RWLock;
 typedef struct _Eina_Condition Eina_Condition;
+typedef pthread_key_t Eina_TLS;
 
 struct _Eina_Lock
 {
@@ -477,4 +478,32 @@ eina_rwlock_release(Eina_RWLock *mutex)
    return EINA_LOCK_SUCCEED;
 }
 
+static inline Eina_Bool 
+eina_tls_new(Eina_TLS *key)
+{
+   if (pthread_key_create(key, NULL) != 0)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static inline void 
+eina_tls_free(Eina_TLS key)
+{
+   pthread_key_delete(key);
+}
+
+static inline void * 
+eina_tls_get(Eina_TLS key)
+{
+   return pthread_getspecific(key);
+}
+
+static inline Eina_Bool 
+eina_tls_set(Eina_TLS key, const void *data)
+{
+   if (pthread_setspecific(key, data) != 0)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
 #endif
index e6d503a35859529f75cc2f123dab78acde116431..64097afef9d40b3aa4de5fc4a1efb278d111d19a 100644 (file)
@@ -215,6 +215,30 @@ eina_rwlock_take_write(Eina_RWLock *mutex EINA_UNUSED)
    return EINA_LOCK_FAIL;
 }
 
+static inline Eina_Bool 
+eina_tls_new(Eina_TLS *key)
+{
+   return EINA_FALSE;
+}
+
+static inline void 
+eina_tls_free(Eina_TLS key)
+{
+}
+
+static inline void *
+eina_tls_get(Eina_TLS key)
+{
+   return NULL;
+}
+
+static inline Eina_Bool 
+eina_tls_set(Eina_TLS key, const void *data)
+{
+   return EINA_FALSE;
+}
+
+
 /**
  * @}
  */
index 7cc58b90442536922af75662c6bb64171628738b..fa0c8e60809d32b9a48a8fff4296c7f844702f55 100644 (file)
@@ -433,4 +433,32 @@ eina_rwlock_release(Eina_RWLock *mutex)
    return EINA_LOCK_SUCCEED;
 }
 
+static inline Eina_Bool 
+eina_tls_new(Eina_TLS *key)
+{
+   if (TlsAlloc() == TLS_OUT_OF_INDEXES)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static inline void 
+eina_tls_free(Eina_TLS key)
+{
+   TlsFree(key);
+}
+
+static inline void *
+eina_tls_get(Eina_TLS key)
+{
+   return (void*)TlsGetValue(key);
+}
+
+static inline Eina_Bool 
+eina_tls_set(Eina_TLS key, const void *data)
+{
+   if (TlsSetValue(key, (LPVOID)data) == 0)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
 #endif
index 1be0890841ea04faef3526a893b3418526bed3ce..965d475ce9e86717487da1b233944cf7c2328a55 100644 (file)
@@ -23,8 +23,9 @@
 
 EAPI extern Eina_Bool _threads_activated;
 
-typedef HANDLE Eina_Lock;
+typedef HANDLE    Eina_Lock;
 typedef Eina_Lock Eina_RWLock;
+typedef DWORD     Eina_TLS;
 
 static inline Eina_Bool
 eina_lock_new(Eina_Lock *mutex)
@@ -144,4 +145,34 @@ eina_rwlock_release(Eina_RWLock *mutex)
    return eina_lock_release(mutex);
 }
 
+static inline Eina_Bool 
+eina_tls_new(Eina_TLS *key)
+{
+   if (TlsAlloc() == TLS_OUT_OF_INDEXES)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+static inline void 
+eina_tls_free(Eina_TLS key)
+{
+   TlsFree(key);
+}
+
+static inline void *
+eina_tls_get(Eina_TLS key)
+{
+   return (void*)TlsGetValue(key);
+}
+
+static inline Eina_Bool 
+eina_tls_set(Eina_TLS key, const void *data)
+{
+   if (TlsSetValue(key, (LPVOID)data) == 0)
+      return EINA_FALSE;
+   return EINA_TRUE;
+}
+
+
+
 #endif
index 3b2f61040d271cc75a668dd1db667c8aaf16f088..7c26dc0022a88b6c59e6cf8488d859bde7eac322 100644 (file)
@@ -76,6 +76,12 @@ static inline Eina_Lock_Result eina_rwlock_take_read(Eina_RWLock *mutex);
 static inline Eina_Lock_Result eina_rwlock_take_write(Eina_RWLock *mutex);
 static inline Eina_Lock_Result eina_rwlock_release(Eina_RWLock *mutex);
 
+static inline Eina_Bool eina_tls_new(Eina_TLS *key);
+static inline void eina_tls_free(Eina_TLS key);
+static inline void *eina_tls_get(Eina_TLS key);
+static inline Eina_Bool eina_tls_set(Eina_TLS key, const void *data);
+
+
 #ifdef EINA_HAVE_DEBUG_THREADS
 # define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val)                          \
   do {                                                                 \