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:
Frank Ch. Eigler 2006-11-10 18:42:28 +00:00 committed by Frank Ch. Eigler
parent a6b03a63d6
commit f70d742fc8
3 changed files with 70 additions and 6 deletions

View File

@ -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>:

View File

@ -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))
{

View File

@ -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