+2007-11-30 Bruno Haible <bruno@clisp.org>
+
+ * lib/lock.h (gl_recursive_lock_init) [PTHREAD &&
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: Call
+ glthread_recursive_lock_init.
+ * lib/lock.c (glthread_recursive_lock_init)
+ [PTHREAD_RECURSIVE_MUTEX_INITIALIZER]: New function.
+ Reported by Yoann Vandoorselaere <yoann.v@prelude-ids.com>.
+
2007-11-28 Paul Eggert <eggert@cs.ucla.edu>
New function qset_acl, like set_acl but with syscall semantics.
/* 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 General Public License as published by
# 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