From: Johannes Sixt <j.sixt@viscovery.net>
To: Fredrik Kuivinen <frekui@gmail.com>
Cc: Nicolas Pitre <nico@fluxnic.net>,
Shawn Pearce <spearce@spearce.org>,
Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org
Subject: [PATCH] Thread-safe xmalloc and xrealloc needs a recursive mutex
Date: Thu, 08 Apr 2010 09:15:39 +0200 [thread overview]
Message-ID: <4BBD829B.8040700@viscovery.net> (raw)
In-Reply-To: <20100407144555.GA23911@fredrik-laptop>
From: Johannes Sixt <j6t@kdbg.org>
The mutex used to protect object access (read_mutex) may need to be
acquired recursively. Introduce init_recursive_mutex() helper function
in thread-utils.c that constructs a mutex with the PHREAD_MUTEX_RECURSIVE
attribute.
pthread_mutex_init() emulation on Win32 is already recursive as it is
implemented on top of the CRITICAL_SECTION type, which is recursive.
http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx
Add do-nothing compatibility wrappers for pthread_mutexattr* functions.
Initial-version-by: Fredrik Kuivinen <frekui@gmail.com>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
Am 4/7/2010 16:45, schrieb Fredrik Kuivinen:
> We only need something like the following (on top of Nico's previous
> patch). Warning: It hasn't even been compile tested on WIN32.
Unfortunately, it doesn't build. This patch replaces the tip of
nd/malloc-threading.
BTW, your uses of strerror(errno) in init_recursive_mutex() were wrong
(pthread functions do not set errno), but it is better in any case to
avoid die() in this function.
-- Hannes
builtin-grep.c | 2 +-
builtin-pack-objects.c | 4 ++--
compat/win32/pthread.h | 8 +++++++-
thread-utils.c | 16 ++++++++++++++++
thread-utils.h | 1 +
5 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/builtin-grep.c b/builtin-grep.c
index 371db0a..52137f4 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -16,8 +16,8 @@
#include "quote.h"
#ifndef NO_PTHREADS
-#include "thread-utils.h"
#include <pthread.h>
+#include "thread-utils.h"
#endif
static char const * const grep_usage[] = {
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 0ecc198..26fc7cd 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -18,8 +18,8 @@
#include "refs.h"
#ifndef NO_PTHREADS
-#include "thread-utils.h"
#include <pthread.h>
+#include "thread-utils.h"
#endif
static const char pack_usage[] =
@@ -1586,7 +1586,7 @@ static pthread_cond_t progress_cond;
*/
static void init_threaded_search(void)
{
- pthread_mutex_init(&read_mutex, NULL);
+ init_recursive_mutex(&read_mutex);
pthread_mutex_init(&cache_mutex, NULL);
pthread_mutex_init(&progress_mutex, NULL);
pthread_cond_init(&progress_cond, NULL);
diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h
index c72f100..a45f8d6 100644
--- a/compat/win32/pthread.h
+++ b/compat/win32/pthread.h
@@ -18,11 +18,17 @@
*/
#define pthread_mutex_t CRITICAL_SECTION
-#define pthread_mutex_init(a,b) InitializeCriticalSection((a))
+#define pthread_mutex_init(a,b) (InitializeCriticalSection((a)), 0)
#define pthread_mutex_destroy(a) DeleteCriticalSection((a))
#define pthread_mutex_lock EnterCriticalSection
#define pthread_mutex_unlock LeaveCriticalSection
+typedef int pthread_mutexattr_t;
+#define pthread_mutexattr_init(a) (*(a) = 0)
+#define pthread_mutexattr_destroy(a) do {} while (0)
+#define pthread_mutexattr_settype(a, t) 0
+#define PTHREAD_MUTEX_RECURSIVE 0
+
/*
* Implement simple condition variable for Windows threads, based on ACE
* implementation.
diff --git a/thread-utils.c b/thread-utils.c
index 4f9c829..589f838 100644
--- a/thread-utils.c
+++ b/thread-utils.c
@@ -1,4 +1,5 @@
#include "cache.h"
+#include <pthread.h>
#if defined(hpux) || defined(__hpux) || defined(_hpux)
# include <sys/pstat.h>
@@ -43,3 +44,18 @@ int online_cpus(void)
return 1;
}
+
+int init_recursive_mutex(pthread_mutex_t *m)
+{
+ pthread_mutexattr_t a;
+ int ret;
+
+ ret = pthread_mutexattr_init(&a);
+ if (!ret) {
+ ret = pthread_mutexattr_settype(&a, PTHREAD_MUTEX_RECURSIVE);
+ if (!ret)
+ ret = pthread_mutex_init(m, &a);
+ pthread_mutexattr_destroy(&a);
+ }
+ return ret;
+}
diff --git a/thread-utils.h b/thread-utils.h
index cce4b77..1727a03 100644
--- a/thread-utils.h
+++ b/thread-utils.h
@@ -2,5 +2,6 @@
#define THREAD_COMPAT_H
extern int online_cpus(void);
+extern int init_recursive_mutex(pthread_mutex_t*);
#endif /* THREAD_COMPAT_H */
--
1.7.0.3.1356.g75346
next prev parent reply other threads:[~2010-04-08 7:15 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20100323161713.3183.57927.stgit@fredrik-laptop>
2010-03-23 17:31 ` [PATCH 1/2] Make xmalloc and xrealloc thread-safe Fredrik Kuivinen
2010-03-23 18:43 ` Shawn O. Pearce
2010-03-23 21:21 ` Fredrik Kuivinen
2010-03-23 23:50 ` Nicolas Pitre
2010-03-24 15:23 ` Fredrik Kuivinen
2010-03-24 17:53 ` Nicolas Pitre
2010-03-24 18:22 ` Shawn Pearce
2010-03-24 18:44 ` Junio C Hamano
2010-03-24 18:54 ` Nicolas Pitre
2010-03-24 19:57 ` Shawn Pearce
2010-03-24 20:22 ` [PATCH] " Nicolas Pitre
2010-03-24 20:28 ` Shawn O. Pearce
2010-03-24 21:02 ` Nicolas Pitre
2010-03-24 21:11 ` Junio C Hamano
2010-03-24 21:28 ` Junio C Hamano
2010-03-27 13:26 ` Fredrik Kuivinen
2010-03-27 18:59 ` Nicolas Pitre
2010-03-31 6:57 ` Fredrik Kuivinen
2010-04-07 2:57 ` [PATCH v2] " Nicolas Pitre
2010-04-07 3:16 ` Shawn O. Pearce
2010-04-07 4:51 ` Nicolas Pitre
2010-04-07 12:29 ` Shawn Pearce
2010-04-07 13:17 ` Nicolas Pitre
2010-04-07 14:30 ` Shawn Pearce
2010-04-07 14:47 ` Nicolas Pitre
2010-04-07 14:45 ` Fredrik Kuivinen
2010-04-07 15:08 ` Nicolas Pitre
2010-04-07 16:13 ` Fredrik Kuivinen
2010-04-07 16:44 ` Erik Faye-Lund
2010-04-07 18:37 ` Nicolas Pitre
2010-04-07 15:27 ` Sverre Rabbelier
2010-04-07 16:15 ` Fredrik Kuivinen
2010-04-07 16:17 ` Junio C Hamano
2010-04-07 18:49 ` Johannes Sixt
2010-04-08 7:15 ` Johannes Sixt [this message]
2010-04-08 8:42 ` [PATCH] Thread-safe xmalloc and xrealloc needs a recursive mutex Fredrik Kuivinen
2010-04-07 5:21 ` [PATCH v2] Make xmalloc and xrealloc thread-safe Junio C Hamano
2010-03-23 17:31 ` [PATCH 2/2] Make sha1_to_hex thread-safe Fredrik Kuivinen
2010-03-23 20:23 ` Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BBD829B.8040700@viscovery.net \
--to=j.sixt@viscovery.net \
--cc=frekui@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=nico@fluxnic.net \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.