30c3de1ffb
* BCC_MAKEFILE: Merge with GC 6.3alpha1 release. * ChangeLog: Likewise. * Makefile.am: Likewise. * Makefile.direct: Likewise. * Makefile.dj: Likewise. * allchblk.c: Likewise. * alloc.c: Likewise. * backgraph.c: Likewise. * configure.host: Likewise. * configure.in: Likewise. * dbg_mlc.c: Likewise. * dyn_load.c: Likewise. * finalize.c: Likewise. * gc_cpp.cc: Likewise. * gc_dlopen.c: Likewise. * gcj_mlc.c: Likewise. * if_mach.c: Likewise. * mach_dep.c: Likewise. * malloc.c: Likewise. * mallocx.c: Likewise. * mark.c: Likewise. * mark_rts.c: Likewise. * misc.c: Likewise. * os_dep.c: Likewise. * ptr_chck.c: Likewise. * reclaim.c: Likewise. * solaris_pthreads.c: Likewise. * solaris_threads.c: Likewise. * sparc_mach_dep.S: Likewise. * threadlibs.c: Likewise. * typd_mlc.c: Likewise. * version.h: Likewise. * win32_threads.c: Likewise. * Mac_files/MacOS_Test_config.h: Likewise. * Mac_files/MacOS_config.h: Likewise. * cord/cordbscs.c: Likewise. * cord/cordprnt.c: Likewise. * cord/de_win.c: Likewise. * doc/README: Likewise. * doc/README.MacOSX: Likewise. * doc/README.changes: Likewise. * doc/README.environment: Likewise. * doc/README.ews4800: Likewise. * doc/README.linux: Likewise. * doc/README.macros: Likewise. * doc/README.win32: Likewise. * doc/debugging.html: Likewise. * doc/gcdescr.html: Likewise. * doc/tree.html: Likewise. * include/Makefile.in: Likewise. * include/gc.h: Likewise. * include/gc_cpp.h: Likewise. * include/gc_local_alloc.h: Likewise. * include/gc_mark.h: Likewise. * include/gc_pthread_redirects.h: Likewise. * include/gc_typed.h: Likewise. * include/new_gc_alloc.h: Likewise. * include/private/dbg_mlc.h: Likewise. * include/private/gc_hdrs.h: Likewise. * include/private/gc_locks.h: Likewise. * include/private/gc_pmark.h: Likewise. * include/private/gc_priv.h: Likewise. * include/private/gcconfig.h: Likewise. * include/private/solaris_threads.h: Likewise. * include/private/specific.h: Likewise. * tests/test.c: Likewise. * tests/test_cpp.cc: Likewise. * configure: Rebuild. * Makefile.in: Rebuild. * mips_sgi_mach_dep.s: Add. * alpha_mach_dep.s: Remove. * irix_threads.c: Remove. * linux_threads.c: Remove. * mips_sgi_mach_dep.S: Remove. * missing: Remove. * powerpc_macosx_mach_dep.s: Remove. * doc/Makefile.am: Remove. * doc/Makefile.in: Remove. From-SVN: r69880
92 lines
3.1 KiB
C
92 lines
3.1 KiB
C
/*
|
|
* Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
|
|
* Copyright (c) 1997 by Silicon Graphics. All rights reserved.
|
|
* Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
|
|
*
|
|
* THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
|
|
* OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
|
|
*
|
|
* Permission is hereby granted to use or copy this program
|
|
* for any purpose, provided the above notices are retained on all copies.
|
|
* Permission to modify the code and to distribute modified code is granted,
|
|
* provided the above notices are retained, and a notice that the code was
|
|
* modified is included with the above copyright notice.
|
|
*
|
|
* Original author: Bill Janssen
|
|
* Heavily modified by Hans Boehm and others
|
|
*/
|
|
|
|
/*
|
|
* This used to be in dyn_load.c. It was extracted into a separate file
|
|
* to avoid having to link against libdl.{a,so} if the client doesn't call
|
|
* dlopen. Of course this fails if the collector is in a dynamic
|
|
* library. -HB
|
|
*/
|
|
|
|
#include "private/gc_priv.h"
|
|
|
|
# if (defined(GC_PTHREADS) && !defined(GC_DARWIN_THREADS)) \
|
|
|| defined(GC_SOLARIS_THREADS)
|
|
|
|
# if defined(dlopen) && !defined(GC_USE_LD_WRAP)
|
|
/* To support various threads pkgs, gc.h interposes on dlopen by */
|
|
/* defining "dlopen" to be "GC_dlopen", which is implemented below. */
|
|
/* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */
|
|
/* real system dlopen() in their implementation. We first remove */
|
|
/* gc.h's dlopen definition and restore it later, after GC_dlopen(). */
|
|
# undef dlopen
|
|
# endif
|
|
|
|
/* Make sure we're not in the middle of a collection, and make */
|
|
/* sure we don't start any. Returns previous value of GC_dont_gc. */
|
|
/* This is invoked prior to a dlopen call to avoid synchronization */
|
|
/* issues. We can't just acquire the allocation lock, since startup */
|
|
/* code in dlopen may try to allocate. */
|
|
/* This solution risks heap growth in the presence of many dlopen */
|
|
/* calls in either a multithreaded environment, or if the library */
|
|
/* initialization code allocates substantial amounts of GC'ed memory. */
|
|
/* But I don't know of a better solution. */
|
|
static void disable_gc_for_dlopen()
|
|
{
|
|
LOCK();
|
|
while (GC_incremental && GC_collection_in_progress()) {
|
|
GC_collect_a_little_inner(1000);
|
|
}
|
|
++GC_dont_gc;
|
|
UNLOCK();
|
|
}
|
|
|
|
/* Redefine dlopen to guarantee mutual exclusion with */
|
|
/* GC_register_dynamic_libraries. */
|
|
/* Should probably happen for other operating systems, too. */
|
|
|
|
#include <dlfcn.h>
|
|
|
|
#ifdef GC_USE_LD_WRAP
|
|
void * __wrap_dlopen(const char *path, int mode)
|
|
#else
|
|
void * GC_dlopen(path, mode)
|
|
GC_CONST char * path;
|
|
int mode;
|
|
#endif
|
|
{
|
|
void * result;
|
|
|
|
# ifndef USE_PROC_FOR_LIBRARIES
|
|
disable_gc_for_dlopen();
|
|
# endif
|
|
# ifdef GC_USE_LD_WRAP
|
|
result = (void *)__real_dlopen(path, mode);
|
|
# else
|
|
result = dlopen(path, mode);
|
|
# endif
|
|
# ifndef USE_PROC_FOR_LIBRARIES
|
|
GC_enable(); /* undoes disable_gc_for_dlopen */
|
|
# endif
|
|
return(result);
|
|
}
|
|
# endif /* GC_PTHREADS || GC_SOLARIS_THREADS ... */
|
|
|
|
|
|
|