All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Sixt <j6t@kdbg.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Nicolas Pitre <nico@fluxnic.net>
Subject: [PATCH 1/2] Have set_try_to_free_routine return the previous routine
Date: Sat, 8 May 2010 17:13:49 +0200	[thread overview]
Message-ID: <201005081713.49937.j6t@kdbg.org> (raw)
In-Reply-To: <4BDDDA21.4090304@kdbg.org>

This effectively requires from the callers of set_try_to_free_routine to
treat the try-to-free-routines as a stack.

We will need this for the next patch where the only current caller cannot
depend on that the previously set routine was the default routine.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
On Sonntag, 2. Mai 2010, Johannes Sixt wrote:
> Am 02.05.2010 18:12, schrieb Junio C Hamano:
> > * np/malloc-threading (2010-04-08) 2 commits
> >
> > * js/async-thread (2010-03-09) 7 commits
>
> Note that np/malloc-threading does not help the potential xmalloc race
> condition in js/async-thread topic at all. :-( np/malloc-threading is only
> about a race that is internal in pack-objects.
>
> Now that you force me to think about the problem, I suggest something along
> these lines: Disable try_to_free_routine when GIT_TRACE is set, and require
> callers of set_try_to_free_routine to restore the previous routine.

Here is a 2-patch series that implements this idea. I wrote it on top of
np/malloc-threading, because it implements the infrastructure that is
necessary for this.

 builtin-pack-objects.c |    6 ++++--
 git-compat-util.h      |    3 ++-
 wrapper.c              |    6 ++++--
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 26fc7cd..5279cd9 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1556,6 +1556,8 @@ static void try_to_free_from_threads(size_t size)
 	read_unlock();
 }
 
+try_to_free_t old_try_to_free_routine;
+
 /*
  * The main thread waits on the condition that (at least) one of the workers
  * has stopped working (which is indicated in the .working member of
@@ -1590,12 +1592,12 @@ static void init_threaded_search(void)
 	pthread_mutex_init(&cache_mutex, NULL);
 	pthread_mutex_init(&progress_mutex, NULL);
 	pthread_cond_init(&progress_cond, NULL);
-	set_try_to_free_routine(try_to_free_from_threads);
+	old_try_to_free_routine = set_try_to_free_routine(try_to_free_from_threads);
 }
 
 static void cleanup_threaded_search(void)
 {
-	set_try_to_free_routine(NULL);
+	set_try_to_free_routine(old_try_to_free_routine);
 	pthread_cond_destroy(&progress_cond);
 	pthread_mutex_destroy(&read_mutex);
 	pthread_mutex_destroy(&cache_mutex);
diff --git a/git-compat-util.h b/git-compat-util.h
index 1c171db..828aada 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -346,7 +346,8 @@ static inline char *gitstrchrnul(const char *s, int c)
 
 extern void release_pack_memory(size_t, int);
 
-extern void set_try_to_free_routine(void (*routine)(size_t));
+typedef void (*try_to_free_t)(size_t);
+extern try_to_free_t set_try_to_free_routine(try_to_free_t);
 
 extern char *xstrdup(const char *str);
 extern void *xmalloc(size_t size);
diff --git a/wrapper.c b/wrapper.c
index 62edb57..8aa9df9 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -10,9 +10,11 @@ static void try_to_free_builtin(size_t size)
 
 static void (*try_to_free_routine)(size_t size) = try_to_free_builtin;
 
-void set_try_to_free_routine(void (*routine)(size_t))
+try_to_free_t set_try_to_free_routine(try_to_free_t routine)
 {
-	try_to_free_routine = (routine) ? routine : try_to_free_builtin;
+	try_to_free_t old = try_to_free_routine;
+	try_to_free_routine = routine;
+	return old;
 }
 
 char *xstrdup(const char *str)
-- 
1.7.1.64.ga1799.dirty

  reply	other threads:[~2010-05-08 15:18 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-02 16:12 What's cooking in git.git (May 2010, #01; Sun, 2) Junio C Hamano
2010-05-02 20:01 ` Johannes Sixt
2010-05-08 15:13   ` Johannes Sixt [this message]
2010-05-08 15:18     ` [PATCH 2/2] Do not call release_pack_memory in malloc wrappers when GIT_TRACE is used Johannes Sixt
2010-05-03 12:48 ` What's cooking in git.git (May 2010, #01; Sun, 2) Jakub Narebski
2010-05-03 18:54 ` Will Palmer
2010-05-04  0:25   ` jn/shortlog (Re: What's cooking in git.git (May 2010, #01; Sun, 2)) Jonathan Nieder
2010-05-04  1:56     ` jn/shortlog Jonathan Nieder
2010-05-04  2:52       ` [PATCH v2 0/5] jn/shortlog Jonathan Nieder
2010-05-04  2:57         ` [PATCH 1/5] Documentation/shortlog: scripted users should not rely on implicit HEAD Jonathan Nieder
2010-05-04  2:57         ` [PATCH 2/5] t4201 (shortlog): guard setup with test_expect_success Jonathan Nieder
2010-05-04  2:58         ` [PATCH 3/5] t4201 (shortlog): Test output format with multiple authors Jonathan Nieder
2010-05-04  2:59         ` [PATCH 4/5] shortlog: Document and test --format option Jonathan Nieder
2010-05-04  3:18         ` [PATCH 5/5] pretty: Respect --abbrev option Jonathan Nieder
2010-05-04  8:34           ` Jonathan Nieder
2010-05-08 16:43 ` What's cooking in git.git (May 2010, #01; Sun, 2) Clemens Buchacher

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=201005081713.49937.j6t@kdbg.org \
    --to=j6t@kdbg.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=nico@fluxnic.net \
    /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.