mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
a6b03a63d6
commit
f70d742fc8
|
|
@ -1,3 +1,12 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2006-11-06 Frank Ch. Eigler <fche@redhat.com>
|
2006-11-06 Frank Ch. Eigler <fche@redhat.com>
|
||||||
|
|
||||||
From Herman ten Brugge <hermantenbrugge@home.nl>:
|
From Herman ten Brugge <hermantenbrugge@home.nl>:
|
||||||
|
|
|
||||||
|
|
@ -75,21 +75,24 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
|
||||||
|
|
||||||
#if PIC
|
#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. */
|
/* A special bootstrap variant. */
|
||||||
void *
|
void *
|
||||||
__mf_0fn_malloc (size_t c)
|
__mf_0fn_malloc (size_t c)
|
||||||
{
|
{
|
||||||
enum foo { BS = 4096, NB=10 };
|
|
||||||
static char bufs[NB][BS];
|
|
||||||
static unsigned bufs_used[NB];
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i=0; i<NB; 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;
|
__mf_0fn_bufs_used[i] = 1;
|
||||||
return & bufs[i][0];
|
return & __mf_0fn_bufs[i][0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -246,6 +249,19 @@ WRAPPER(void, free, void *buf)
|
||||||
if (UNLIKELY(buf == NULL))
|
if (UNLIKELY(buf == NULL))
|
||||||
return;
|
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 ();
|
LOCKTH ();
|
||||||
if (UNLIKELY(!freeq_initialized))
|
if (UNLIKELY(!freeq_initialized))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
/* PR 28578 */
|
||||||
|
|
||||||
|
void* test_thread(void* arg)
|
||||||
|
{
|
||||||
|
printf("Hello from thread!\n");
|
||||||
|
pthread_exit(NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
pthread_t thread;
|
||||||
|
int arg = 0;
|
||||||
|
pthread_create(&thread, NULL, test_thread, (void*)arg);
|
||||||
|
pthread_join(thread, NULL);
|
||||||
|
pthread_exit(NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-output "Hello from thread!\n" } */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* Even this test case replicates the problem. However, when built in
|
||||||
|
static mode, it blows up during __mf_init (?!?!?!) with a
|
||||||
|
pthread_mutex_lock deadlock error. */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
pthread_exit(NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue