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>
|
||||
|
||||
From Herman ten Brugge <hermantenbrugge@home.nl>:
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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