-#define G_THREAD_UF(name, arglist) \
- (*g_thread_functions_for_glib_use . name) arglist
-#define G_THREAD_CF(name, fail, arg) \
- (g_thread_supported () ? G_THREAD_UF (name, arg) : (fail))
-/* keep in mind, all those mutexes and static mutexes are not
- * recursive in general, don't rely on that
- */
+#define G_THREAD_UF(op, arglist) \
+ (*g_thread_functions_for_glib_use . op) arglist
+#define G_THREAD_CF(op, fail, arg) \
+ (g_thread_supported () ? G_THREAD_UF (op, arg) : (fail))
+#define G_THREAD_ECF(op, fail, mutex, name, type) \
+ (g_thread_supported () ? \
+ ((type(*)(GMutex*, gulong, gchar*, gchar*)) \
+ (*g_thread_functions_for_glib_use . op)) \
+ (mutex, G_MUTEX_DEBUG_MAGIC, G_STRINGIFY (name), G_STRLOC) : (fail))
+#ifndef G_ERRORCHECK_MUTEXES
+#define g_mutex_lock_with_debug_name(mutex, name) \
+ G_THREAD_CF (mutex_lock, (void)0, (mutex))
+#define g_mutex_trylock_with_debug_name(mutex, name) \
+ G_THREAD_CF (mutex_trylock, TRUE, (mutex))
+#define g_mutex_unlock_with_debug_name(mutex, name) \
+ G_THREAD_CF (mutex_unlock, (void)0, (mutex))
+#else /* G_ERRORCHECK_MUTEXES */
+#define g_mutex_lock_with_debug_name(mutex, name) \
+ G_THREAD_ECF (mutex_lock, (void)0, mutex, name, void)
+#define g_mutex_trylock_with_debug_name(mutex, name) \
+ G_THREAD_ECF (mutex_trylock, TRUE, mutex, name, gboolean)
+#define g_mutex_unlock_with_debug_name(mutex, name) \
+ G_THREAD_ECF (mutex_unlock, (void)0, mutex, name, void)
+#endif /* G_ERRORCHECK_MUTEXES */
+