Eina_Lock_Bt_Func lock_bt[EINA_LOCK_DEBUG_BT_NUM]; /**< The function that will produce a backtrace on the thread that has the lock */
int lock_bt_num; /**< Number of addresses in the backtrace */
Eina_Bool locked : 1; /**< Indicates locked or not locked */
+ Eina_Bool recursive : 1; /**< Indicates recursive lock */
#endif
};
static inline Eina_Bool
eina_lock_new(Eina_Lock *mutex)
{
- return _eina_lock_new(mutex, EINA_FALSE);
+ Eina_Bool ret = _eina_lock_new(mutex, EINA_FALSE);
+#ifdef EINA_HAVE_DEBUG_THREADS
+ mutex->recursive = EINA_FALSE;
+#endif
+ return ret;
}
static inline Eina_Bool
eina_lock_recursive_new(Eina_Lock *mutex)
{
- return _eina_lock_new(mutex, EINA_TRUE);
+ Eina_Bool ret = _eina_lock_new(mutex, EINA_TRUE);
+#ifdef EINA_HAVE_DEBUG_THREADS
+ mutex->recursive = EINA_TRUE;
+#endif
+ return ret;
}
static inline void
else EINA_LOCK_ABORT_DEBUG(ok, lock, mutex);
#ifdef EINA_HAVE_DEBUG_THREADS
+ /* recursive locks can't make use of any of this */
+ if (mutex->recursive) return ret;
mutex->locked = 1;
mutex->lock_thread_id = pthread_self();
mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), EINA_LOCK_DEBUG_BT_NUM);
#ifdef EINA_HAVE_DEBUG_THREADS
if (ret == EINA_LOCK_SUCCEED)
{
+ /* recursive locks can't make use of any of this */
+ if (mutex->recursive) return ret;
mutex->locked = 1;
mutex->lock_thread_id = pthread_self();
mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), EINA_LOCK_DEBUG_BT_NUM);
#endif
#ifdef EINA_HAVE_DEBUG_THREADS
- pthread_mutex_lock(&_eina_tracking_lock);
- _eina_tracking = eina_inlist_remove(_eina_tracking,
- EINA_INLIST_GET(mutex));
- pthread_mutex_unlock(&_eina_tracking_lock);
-
- mutex->locked = 0;
- mutex->lock_thread_id = 0;
- memset(mutex->lock_bt, 0, EINA_LOCK_DEBUG_BT_NUM * sizeof(Eina_Lock_Bt_Func));
- mutex->lock_bt_num = 0;
+/* recursive locks can't make use of any of this */
+ if (!mutex->recursive)
+ {
+ mutex->locked = 0;
+ mutex->lock_thread_id = 0;
+ memset(mutex->lock_bt, 0, EINA_LOCK_DEBUG_BT_NUM * sizeof(Eina_Lock_Bt_Func));
+ mutex->lock_bt_num = 0;
+ pthread_mutex_lock(&_eina_tracking_lock);
+ _eina_tracking = eina_inlist_remove(_eina_tracking,
+ EINA_INLIST_GET(mutex));
+ pthread_mutex_unlock(&_eina_tracking_lock);
+ }
#endif
ok = pthread_mutex_unlock(&(mutex->mutex));
if (ok == 0) ret = EINA_LOCK_SUCCEED;