diff options
author | Frank Ch. Eigler <fche@redhat.com> | 2006-11-10 18:42:28 +0000 |
---|---|---|
committer | Frank Ch. Eigler <fche@gcc.gnu.org> | 2006-11-10 18:42:28 +0000 |
commit | f70d742fc89c922a9ad5508753027eb17827369c (patch) | |
tree | f1e9d593de06af753a78e3763ac0ae92abff57ec /libmudflap/mf-hooks1.c | |
parent | a6b03a63d60ea2c720d2351812dee479b9137183 (diff) | |
download | gcc-f70d742fc89c922a9ad5508753027eb17827369c.tar.gz |
re PR libmudflap/28578 (A most simple multithreaded program (practically any multithreaded one) causes mudflap violation)
2006-11-10 Frank Ch. Eigler <fche@redhat.com>
PR libmudflap/28578
* mf-hooks1.c (__mf_0fn_malloc): Make the bootstrap buffers
static but not function scope static.
(free): Skip deallocation attempts for objects placed into
bootstrap buffers.
* testsuite/libmudflap.cth/pass59-frag.c: New test.
M libmudflap/mf-hooks1.c
M libmudflap/ChangeLog
A libmudflap/testsuite/libmudflap.cth/pass59-frag.c
From-SVN: r118662
Diffstat (limited to 'libmudflap/mf-hooks1.c')
-rw-r--r-- | libmudflap/mf-hooks1.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/libmudflap/mf-hooks1.c b/libmudflap/mf-hooks1.c index bef22687f19..acdbc447a5d 100644 --- a/libmudflap/mf-hooks1.c +++ b/libmudflap/mf-hooks1.c @@ -75,21 +75,24 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #if PIC + +enum { BS = 4096, NB=10 }; +static char __mf_0fn_bufs[NB][BS]; +static unsigned __mf_0fn_bufs_used[NB]; + + /* A special bootstrap variant. */ void * __mf_0fn_malloc (size_t c) { - enum foo { BS = 4096, NB=10 }; - static char bufs[NB][BS]; - static unsigned bufs_used[NB]; unsigned i; for (i=0; i<NB; i++) { - if (! bufs_used[i] && c < BS) + if (! __mf_0fn_bufs_used[i] && c < BS) { - bufs_used[i] = 1; - return & bufs[i][0]; + __mf_0fn_bufs_used[i] = 1; + return & __mf_0fn_bufs[i][0]; } } return NULL; @@ -246,6 +249,19 @@ WRAPPER(void, free, void *buf) if (UNLIKELY(buf == NULL)) return; +#if PIC + /* Check whether the given buffer might have come from a + __mf_0fn_malloc/calloc call that for whatever reason was not + redirected back to __mf_0fn_free. If so, we just ignore the + call. */ + if (UNLIKELY((uintptr_t) buf >= (uintptr_t) __mf_0fn_bufs && + (uintptr_t) buf < ((uintptr_t) __mf_0fn_bufs + sizeof(__mf_0fn_bufs)))) + { + VERBOSE_TRACE ("skipping free of boot (0fn) alloc buffer %p\n", buf); + return; + } +#endif + LOCKTH (); if (UNLIKELY(!freeq_initialized)) { |