From: Bruno Haible Date: Fri, 30 Nov 2007 15:39:12 +0000 (+0100) Subject: Make recursive locks really recursive on POSIX systems. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=536677c5756ce56ca2079820450d116f403b46e2;p=pspp Make recursive locks really recursive on POSIX systems. --- diff --git a/ChangeLog b/ChangeLog index b792a09910..9ebb98f9e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-11-30 Bruno Haible + + * 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 . + 2007-11-28 Paul Eggert New function qset_acl, like set_acl but with syscall semantics. diff --git a/lib/lock.c b/lib/lock.c index 34a59ab339..c23b8b8460 100644 --- a/lib/lock.c +++ b/lib/lock.c @@ -1,5 +1,5 @@ /* 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 @@ -250,7 +250,24 @@ glthread_rwlock_destroy (gl_rwlock_t *lock) # 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) diff --git a/lib/lock.h b/lib/lock.h index 3f0da52f43..0b5f8e3ab0 100644 --- a/lib/lock.h +++ b/lib/lock.h @@ -361,11 +361,11 @@ typedef pthread_mutex_t gl_recursive_lock_t; 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 \ @@ -388,6 +388,7 @@ typedef pthread_mutex_t gl_recursive_lock_t; abort (); \ } \ while (0) +extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock); # else