eina: add Eina_Condition.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 9 May 2011 10:32:56 +0000 (10:32 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 9 May 2011 10:32:56 +0000 (10:32 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@59287 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_inline_lock_posix.x
src/include/eina_lock.h

index 96a8cfd..68a26b3 100644 (file)
@@ -40,13 +40,14 @@ typedef void (*Eina_Lock_Bt_Func) ();
 #endif
 
 typedef struct _Eina_Lock Eina_Lock;
+typedef struct _Eina_Condition Eina_Condition;
 
 struct _Eina_Lock
 {
 #ifdef EINA_HAVE_DEBUG_THREADS
    EINA_INLIST;
 #endif
-   pthread_mutex_t  mutex;
+   pthread_mutex_t   mutex;
 #ifdef EINA_HAVE_DEBUG_THREADS
    pthread_t         lock_thread_id;
    Eina_Lock_Bt_Func lock_bt[EINA_LOCK_DEBUG_BT_NUM];
@@ -55,6 +56,12 @@ struct _Eina_Lock
 #endif
 };
 
+struct _Eina_Condition
+{
+   Eina_Lock      *lock;
+   pthread_cond_t  condition;
+};
+
 EAPI extern Eina_Bool _eina_threads_activated;
 
 #ifdef EINA_HAVE_DEBUG_THREADS
@@ -256,4 +263,61 @@ eina_lock_debug(const Eina_Lock *mutex)
 #endif
 }
 
+static inline Eina_Bool
+eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex)
+{
+#ifdef EINA_HAVE_DEBUG_THREADS
+   assert(pthread_equal(_eina_main_loop, pthread_self()));
+   memset(cond, 0, sizeof (Eina_Condition));
+#endif
+
+   cond->lock = mutex;
+   if (pthread_cond_init(&cond->condition, NULL) != 0)
+     {
+#ifdef EINA_HAVE_DEBUG_THREADS
+        if (errno == EBUSY)
+          printf("eina_condition_new on already initialized Eina_Condition\n");
+#endif
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+static inline void
+eina_condition_free(Eina_Condition *cond)
+{
+#ifdef EINA_HAVE_DEBUG_THREADS
+   assert(pthread_equal(_eina_main_loop, pthread_self()));
+#endif
+
+   pthread_cond_destroy(&(cond->condition));
+#ifdef EINA_HAVE_DEBUG_THREADS
+   memset(cond, 0, sizeof (Eina_Condition));
+#endif
+}
+
+static inline Eina_Bool
+eina_condition_wait(Eina_Condition *cond)
+{
+#ifdef EINA_HAVE_DEBUG_THREADS
+   assert(_eina_threads_activated);
+#endif
+
+   return pthread_cond_wait(&(cond->condition), &(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE;
+}
+
+static inline Eina_Bool
+eina_condition_broadcast(Eina_Condition *cond)
+{
+   return pthread_cond_broadcast(&(cond->condition)) == 0 ? EINA_TRUE : EINA_FALSE;
+}
+
+static inline Eina_Bool
+eina_condition_signal(Eina_Condition *cond)
+{
+   return pthread_cond_signal(&(cond->condition)) == 0 ? EINA_TRUE : EINA_FALSE;
+}
+
+
 #endif
index 9b55e78..c6f6c74 100644 (file)
@@ -60,6 +60,12 @@ static inline Eina_Lock_Result eina_lock_take_try(Eina_Lock *mutex);
 static inline Eina_Lock_Result eina_lock_release(Eina_Lock *mutex);
 static inline void eina_lock_debug(const Eina_Lock *mutex);
 
+static inline Eina_Bool eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex);
+static inline void eina_condition_free(Eina_Condition *cond);
+static inline Eina_Bool eina_condition_wait(Eina_Condition *cond);
+static inline Eina_Bool eina_condition_broadcast(Eina_Condition *cond);
+static inline Eina_Bool eina_condition_signal(Eina_Condition *cond);
+
 /**
  * @}
  */