summaryrefslogtreecommitdiff
path: root/libmudflap/mf-hooks1.c
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@redhat.com>2006-11-10 18:42:28 +0000
committerFrank Ch. Eigler <fche@gcc.gnu.org>2006-11-10 18:42:28 +0000
commitf70d742fc89c922a9ad5508753027eb17827369c (patch)
treef1e9d593de06af753a78e3763ac0ae92abff57ec /libmudflap/mf-hooks1.c
parenta6b03a63d60ea2c720d2351812dee479b9137183 (diff)
downloadgcc-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.c28
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))
{