From: Fredrik Kuivinen <frekui@gmail.com>
To: Nicolas Pitre <nico@fluxnic.net>
Cc: Shawn Pearce <spearce@spearce.org>,
Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, Johannes Sixt <j6t@kdbg.org>
Subject: Re: [PATCH v2] Make xmalloc and xrealloc thread-safe
Date: Wed, 7 Apr 2010 16:45:55 +0200 [thread overview]
Message-ID: <20100407144555.GA23911@fredrik-laptop> (raw)
In-Reply-To: <alpine.LFD.2.00.1004070859540.7232@xanadu.home>
On Wed, Apr 07, 2010 at 09:17:04AM -0400, Nicolas Pitre wrote:
> On Wed, 7 Apr 2010, Shawn Pearce wrote:
> > You mentioned avoiding a recursive mutex only because windows
> > emulation doesn't have support for it. But that's exactly what we
> > need here. Shouldn't windows have a recursive mutex object that can
> > just be used inside of the emulation layer when we really need a
> > recursive mutex?
>
> Maybe. That would in fact just mean pushing the double mutex issue into
> the pthread emulation instead of having it outside it. This would
> impact performances for all mutexes although only one instance of them
> currently require a recursive behavior.
As I mentioned in another mail in this thread, our mutex
implementation on WIN32 already is recursive. It is implemented on top
of the CRITICAL_SECTION type, which is recursive. See
http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx
We only need something like the following (on top of Nico's previous
patch). Warning: It hasn't even been compile tested on WIN32.
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 65f797f..19e42cf 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1559,7 +1559,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/thread-utils.c b/thread-utils.c
index 4f9c829..3c8d817 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,24 @@ int online_cpus(void)
return 1;
}
+
+int init_recursive_mutex(pthread_mutex_t *m)
+{
+#ifdef _WIN32
+ /* The mutexes in the WIN32 pthreads emulation layer are
+ * recursive, so we don't have to do anything extra here. */
+ return pthread_mutex_init(m, NULL);
+#else
+ pthread_mutexattr_t a;
+ int ret;
+ if (pthread_mutexattr_init(&a))
+ die("pthread_mutexattr_init failed: %s", strerror(errno));
+
+ if (pthread_mutexattr_settype(&a, PTHREAD_MUTEX_RECURSIVE))
+ die("pthread_mutexattr_settype failed: %s", strerror(errno));
+
+ ret = pthread_mutex_init(m, &a);
+ pthread_mutexattr_destroy(&a);
+ return ret;
+#endif
+}
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 */
next prev parent reply other threads:[~2010-04-07 14:46 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 [this message]
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 ` [PATCH] Thread-safe xmalloc and xrealloc needs a recursive mutex Johannes Sixt
2010-04-08 8:42 ` 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=20100407144555.GA23911@fredrik-laptop \
--to=frekui@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--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.