+2007-11-30 Bruno Haible <bruno@clisp.org>
+
+ * lock.h (gl_recursive_lock_init) [PTHREAD &&
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: Call
+ glthread_recursive_lock_init.
+ * lock.c (glthread_recursive_lock_init)
+ [PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: New function.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
2007-11-28 Bruno Haible <bruno@clisp.org>
* libgnuintl.h.in (fprintf, vfprintf, printf, vprintf, sprintf,
/* Locking in multithreaded situations.
- Copyright (C) 2005-2006 Free Software Foundation, Inc.
+ Copyright (C) 2005-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
# if HAVE_PTHREAD_MUTEX_RECURSIVE
-# if !(defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+void
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+
+ if (pthread_mutexattr_init (&attributes) != 0)
+ abort ();
+ if (pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE) != 0)
+ abort ();
+ if (pthread_mutex_init (lock, &attributes) != 0)
+ abort ();
+ if (pthread_mutexattr_destroy (&attributes) != 0)
+ abort ();
+}
+
+# else
void
glthread_recursive_lock_init (gl_recursive_lock_t *lock)
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
# endif
# define gl_recursive_lock_init(NAME) \
- do \
- { \
- if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) \
- abort (); \
- } \
+ do \
+ { \
+ if (pthread_in_use ()) \
+ glthread_recursive_lock_init (&NAME); \
+ } \
while (0)
# define gl_recursive_lock_lock(NAME) \
do \
abort (); \
} \
while (0)
+extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
# else