Annotation of OpenXM_contrib2/asir2000/gc/gc_dlopen.c, Revision 1.2
1.1 noro 1: /*
2: * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
3: * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
4: * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved.
5: *
6: * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
7: * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
8: *
9: * Permission is hereby granted to use or copy this program
10: * for any purpose, provided the above notices are retained on all copies.
11: * Permission to modify the code and to distribute modified code is granted,
12: * provided the above notices are retained, and a notice that the code was
13: * modified is included with the above copyright notice.
14: *
15: * Original author: Bill Janssen
16: * Heavily modified by Hans Boehm and others
17: */
18:
19: /*
20: * This used to be in dyn_load.c. It was extracted into a separate file
21: * to avoid having to link against libdl.{a,so} if the client doesn't call
1.2 ! noro 22: * dlopen. Of course this fails if the collector is in a dynamic
! 23: * library. -HB
1.1 noro 24: */
25:
26: #include "private/gc_priv.h"
27:
1.2 ! noro 28: # if (defined(GC_PTHREADS) && !defined(GC_DARWIN_THREADS)) \
! 29: || defined(GC_SOLARIS_THREADS)
1.1 noro 30:
31: # if defined(dlopen) && !defined(GC_USE_LD_WRAP)
32: /* To support various threads pkgs, gc.h interposes on dlopen by */
33: /* defining "dlopen" to be "GC_dlopen", which is implemented below. */
34: /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */
35: /* real system dlopen() in their implementation. We first remove */
36: /* gc.h's dlopen definition and restore it later, after GC_dlopen(). */
37: # undef dlopen
38: # endif
39:
40: /* Make sure we're not in the middle of a collection, and make */
41: /* sure we don't start any. Returns previous value of GC_dont_gc. */
42: /* This is invoked prior to a dlopen call to avoid synchronization */
43: /* issues. We can't just acquire the allocation lock, since startup */
44: /* code in dlopen may try to allocate. */
45: /* This solution risks heap growth in the presence of many dlopen */
46: /* calls in either a multithreaded environment, or if the library */
47: /* initialization code allocates substantial amounts of GC'ed memory. */
48: /* But I don't know of a better solution. */
1.2 ! noro 49: static void disable_gc_for_dlopen()
1.1 noro 50: {
51: LOCK();
52: while (GC_incremental && GC_collection_in_progress()) {
53: GC_collect_a_little_inner(1000);
54: }
1.2 ! noro 55: ++GC_dont_gc;
1.1 noro 56: UNLOCK();
57: }
58:
59: /* Redefine dlopen to guarantee mutual exclusion with */
60: /* GC_register_dynamic_libraries. */
61: /* Should probably happen for other operating systems, too. */
62:
63: #include <dlfcn.h>
64:
65: #ifdef GC_USE_LD_WRAP
66: void * __wrap_dlopen(const char *path, int mode)
67: #else
68: void * GC_dlopen(path, mode)
69: GC_CONST char * path;
70: int mode;
71: #endif
72: {
73: void * result;
74:
75: # ifndef USE_PROC_FOR_LIBRARIES
1.2 ! noro 76: disable_gc_for_dlopen();
1.1 noro 77: # endif
78: # ifdef GC_USE_LD_WRAP
79: result = (void *)__real_dlopen(path, mode);
80: # else
81: result = dlopen(path, mode);
82: # endif
83: # ifndef USE_PROC_FOR_LIBRARIES
1.2 ! noro 84: GC_enable(); /* undoes disable_gc_for_dlopen */
1.1 noro 85: # endif
86: return(result);
87: }
88: # endif /* GC_PTHREADS || GC_SOLARIS_THREADS ... */
89:
90:
91:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>