[fedora-java] Thread registration work-around?
Anthony Green
green at redhat.com
Tue Jan 3 21:11:30 UTC 2006
FC5t1's Eclipse crashes on start-up on x86-64 systems...
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=174612
..due to this bug..
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13212
I don't believe this problem is unique to x86-64 - it's just highly
reproducible on that platform.
This is the same thing that was preventing RSSOwl from running on any
platform.
If we aren't prepared to import a new GC snapshot, or backport Hans'
fix, then I propose we modify java-gcj-compat's java.c wrapper to
LD_PRELOAD the following .so before every gij run. It makes sure that
any stray pthread_create() calls go through the GC's thread registration
process. Comments?
/* pthread_create registration wrapper for libgcj. Build it like
so...
gcc -shared -o pr13212.so pr13212.c -lgcj
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdlib.h>
#include <pthread.h>
// A pointer to the real pthread_create_
static int (*pthread_create_) (pthread_t *__restrict __newthread,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg);
// The Boehm collector's pthread_create wrapper.
extern int GC_pthread_create (pthread_t *__restrict __newthread,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg);
// The start routine used by the Boehm collector. We'll use this to
// recognize pthread_create calls made by the collector's wrapper.
extern void *GC_start_routine (void *);
/* Force constr to execute prior to main(). */
static void constr (void) __attribute__ ((constructor));
static void
constr (void)
{
/* Get a pointer to the real pthread_create(). */
pthread_create_ = dlsym (RTLD_NEXT, "pthread_create");
if (pthread_create_ == NULL)
abort ();
}
/** Wrap the pthread_create function. */
int pthread_create (pthread_t *__restrict __newthread,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg)
{
// Call the real pthread_create() if we're called from boehm's wrapper,
// and call boehm's wrapper otherwise.
if (__start_routine == GC_start_routine)
return pthread_create_ (__newthread, __attr, __start_routine, __arg);
else
return GC_pthread_create (__newthread, __attr, __start_routine, __arg);
}
More information about the java-devel
mailing list