diff options
author | ivmai <ivmai> | 2011-01-07 17:10:01 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 21:06:55 +0400 |
commit | 2425c85c5845f968c5125455c3b218441a57fd9b (patch) | |
tree | 1f0d50f5f4815b671edcb3af17088836683d93f0 /gc_dlopen.c | |
parent | ff1f125eef0e2e9fc2bafbd094af1857ef7c438f (diff) | |
download | bdwgc-2425c85c5845f968c5125455c3b218441a57fd9b.tar.gz |
2011-01-07 Ivan Maidanski <ivmai@mail.ru>gc7_2alpha5-20110107
* gc_dlopen.c: Reformat the comments and adjust code indentation.
Diffstat (limited to 'gc_dlopen.c')
-rw-r--r-- | gc_dlopen.c | 116 |
1 files changed, 57 insertions, 59 deletions
diff --git a/gc_dlopen.c b/gc_dlopen.c index 156b1e67..6d886fd6 100644 --- a/gc_dlopen.c +++ b/gc_dlopen.c @@ -18,76 +18,74 @@ #include "private/gc_priv.h" -/* - * 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 - */ +/* 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 */ -# if defined(GC_PTHREADS) && !defined(GC_DARWIN_THREADS) \ - && !defined(GC_WIN32_PTHREADS) +#if defined(GC_PTHREADS) && !defined(GC_DARWIN_THREADS) \ + && !defined(GC_WIN32_PTHREADS) -# undef GC_MUST_RESTORE_REDEFINED_DLOPEN -# 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 -# define GC_MUST_RESTORE_REDEFINED_DLOPEN -# endif +#undef GC_MUST_RESTORE_REDEFINED_DLOPEN +#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 +# define GC_MUST_RESTORE_REDEFINED_DLOPEN +#endif - /* Make sure we're not in the middle of a collection, and make */ - /* sure we don't start any. */ - /* 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 (or, even, heap overflow) in the presence of many dlopen */ - /* calls in either a multi-threaded environment, or if the library */ - /* initialization code allocates substantial amounts of GC'ed memory. */ - static void disable_gc_for_dlopen(void) - { - DCL_LOCK_STATE; - LOCK(); - while (GC_incremental && GC_collection_in_progress()) { - GC_collect_a_little_inner(1000); - } - ++GC_dont_gc; - UNLOCK(); +/* Make sure we're not in the middle of a collection, and make sure we */ +/* don't start any. 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 (or, even, heap overflow) in the presence of many */ +/* dlopen calls in either a multi-threaded environment, or if the */ +/* library initialization code allocates substantial amounts of GC'ed */ +/* memory. */ +static void disable_gc_for_dlopen(void) +{ + DCL_LOCK_STATE; + 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. */ +/* Redefine dlopen to guarantee mutual exclusion with */ +/* GC_register_dynamic_libraries. Should probably happen for */ +/* other operating systems, too. */ #include <dlfcn.h> -/* This is similar to WRAP/REAL_FUNC() in pthread_support.c. */ +/* This is similar to WRAP/REAL_FUNC() in pthread_support.c. */ #ifdef GC_USE_LD_WRAP -# define WRAP_DLFUNC(f) __wrap_##f -# define REAL_DLFUNC(f) __real_##f - void * REAL_DLFUNC(dlopen)(const char *, int); +# define WRAP_DLFUNC(f) __wrap_##f +# define REAL_DLFUNC(f) __real_##f + void * REAL_DLFUNC(dlopen)(const char *, int); #else -# define WRAP_DLFUNC(f) GC_##f -# define REAL_DLFUNC(f) f +# define WRAP_DLFUNC(f) GC_##f +# define REAL_DLFUNC(f) f #endif GC_API void * WRAP_DLFUNC(dlopen)(const char *path, int mode) { - void * result; + void * result; -# ifndef USE_PROC_FOR_LIBRARIES - /* Disable collections. This solution risks heap growth (or, */ - /* even, heap overflow) but there seems no better solutions. */ - disable_gc_for_dlopen(); -# endif - result = REAL_DLFUNC(dlopen)(path, mode); -# ifndef USE_PROC_FOR_LIBRARIES - GC_enable(); /* undoes disable_gc_for_dlopen */ -# endif - return(result); +# ifndef USE_PROC_FOR_LIBRARIES + /* Disable collections. This solution risks heap growth (or, */ + /* even, heap overflow) but there seems no better solutions. */ + disable_gc_for_dlopen(); +# endif + result = REAL_DLFUNC(dlopen)(path, mode); +# ifndef USE_PROC_FOR_LIBRARIES + GC_enable(); /* undoes disable_gc_for_dlopen */ +# endif + return(result); } #ifdef GC_USE_LD_WRAP @@ -98,10 +96,10 @@ GC_API void * WRAP_DLFUNC(dlopen)(const char *path, int mode) { return dlopen(path, mode); } -#endif /* Linker-based interception. */ +#endif /* GC_USE_LD_WRAP */ -# ifdef GC_MUST_RESTORE_REDEFINED_DLOPEN -# define dlopen GC_dlopen -# endif +#ifdef GC_MUST_RESTORE_REDEFINED_DLOPEN +# define dlopen GC_dlopen +#endif #endif /* GC_PTHREADS */ |