+ if (__gthread_active_p ())
+ return __gthrw_(cond_destroy) ((cond_t *) (&(condition->backend)));
+ else
+ return 0;
+}
+
+/* Wait on the condition */
+static inline int
+__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
+{
+ if (__gthread_active_p ())
+ return __gthrw_(cond_wait) ((cond_t *) (&(condition->backend)),
+ (mutex_t *) (&(mutex->backend)));
+ else
+ return 0;
+}
+
+/* Wake up all threads waiting on this condition. */
+static inline int
+__gthread_objc_condition_broadcast (objc_condition_t condition)
+{
+ if (__gthread_active_p ())
+ return __gthrw_(cond_broadcast) ((cond_t *) (&(condition->backend)));
+ else
+ return 0;
+}
+
+/* Wake up one thread waiting on this condition. */
+static inline int
+__gthread_objc_condition_signal (objc_condition_t condition)
+{
+ if (__gthread_active_p ())
+ return __gthrw_(cond_signal) ((cond_t *) (&(condition->backend)));
+ else
+ return 0;
+}
+
+#else /* _LIBOBJC */
+
+static inline int
+__gthread_once (__gthread_once_t *__once, void (*__func) (void))
+{
+ if (! __gthread_active_p ())
+ return -1;
+
+ if (__once == 0 || __func == 0)
+ return EINVAL;
+
+ if (__once->once == 0)
+ {
+ int __status = __gthrw_(mutex_lock) (&__once->mutex);
+ if (__status != 0)
+ return __status;
+ if (__once->once == 0)
+ {
+ (*__func) ();
+ __once->once++;
+ }
+ __gthrw_(mutex_unlock) (&__once->mutex);
+ }