Annotation of OpenXM_contrib2/asir2000/gc/pcr_interface.c, Revision 1.2
1.1 noro 1: /*
2: * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
3: *
4: * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
5: * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
6: *
7: * Permission is hereby granted to use or copy this program
8: * for any purpose, provided the above notices are retained on all copies.
9: * Permission to modify the code and to distribute modified code is granted,
10: * provided the above notices are retained, and a notice that the code was
11: * modified is included with the above copyright notice.
12: */
1.2 ! noro 13: # include "private/gc_priv.h"
1.1 noro 14:
15: # ifdef PCR
16: /*
17: * Note that POSIX PCR requires an ANSI C compiler. Hence we are allowed
18: * to make the same assumption here.
19: * We wrap all of the allocator functions to avoid questions of
20: * compatibility between the prototyped and nonprototyped versions of the f
21: */
22: # include "config/PCR_StdTypes.h"
23: # include "mm/PCR_MM.h"
24: # include <errno.h>
25:
26: # define MY_MAGIC 17L
27: # define MY_DEBUGMAGIC 42L
28:
29: void * GC_AllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
30: {
31: if (ptrFree) {
32: void * result = (void *)GC_malloc_atomic(size);
33: if (clear && result != 0) BZERO(result, size);
34: return(result);
35: } else {
36: return((void *)GC_malloc(size));
37: }
38: }
39:
40: void * GC_DebugAllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
41: {
42: if (ptrFree) {
43: void * result = (void *)GC_debug_malloc_atomic(size, __FILE__,
44: __LINE__);
45: if (clear && result != 0) BZERO(result, size);
46: return(result);
47: } else {
48: return((void *)GC_debug_malloc(size, __FILE__, __LINE__));
49: }
50: }
51:
52: # define GC_ReallocProc GC_realloc
53: void * GC_DebugReallocProc(void * old_object, size_t new_size_in_bytes)
54: {
55: return(GC_debug_realloc(old_object, new_size_in_bytes, __FILE__, __LINE__));
56: }
57:
58: # define GC_FreeProc GC_free
59: # define GC_DebugFreeProc GC_debug_free
60:
61: typedef struct {
62: PCR_ERes (*ed_proc)(void *p, size_t size, PCR_Any data);
63: GC_bool ed_pointerfree;
64: PCR_ERes ed_fail_code;
65: PCR_Any ed_client_data;
66: } enumerate_data;
67:
68: void GC_enumerate_block(h, ed)
69: register struct hblk *h;
70: enumerate_data * ed;
71: {
72: register hdr * hhdr;
73: register int sz;
74: word *p;
75: word * lim;
76:
77: hhdr = HDR(h);
78: sz = hhdr -> hb_sz;
79: if (sz >= 0 && ed -> ed_pointerfree
80: || sz <= 0 && !(ed -> ed_pointerfree)) return;
81: if (sz < 0) sz = -sz;
82: lim = (word *)(h+1) - sz;
83: p = (word *)h;
84: do {
85: if (PCR_ERes_IsErr(ed -> ed_fail_code)) return;
86: ed -> ed_fail_code =
87: (*(ed -> ed_proc))(p, WORDS_TO_BYTES(sz), ed -> ed_client_data);
88: p+= sz;
89: } while (p <= lim);
90: }
91:
92: struct PCR_MM_ProcsRep * GC_old_allocator = 0;
93:
94: PCR_ERes GC_EnumerateProc(
95: PCR_Bool ptrFree,
96: PCR_ERes (*proc)(void *p, size_t size, PCR_Any data),
97: PCR_Any data
98: )
99: {
100: enumerate_data ed;
101:
102: ed.ed_proc = proc;
103: ed.ed_pointerfree = ptrFree;
104: ed.ed_fail_code = PCR_ERes_okay;
105: ed.ed_client_data = data;
106: GC_apply_to_all_blocks(GC_enumerate_block, &ed);
107: if (ed.ed_fail_code != PCR_ERes_okay) {
108: return(ed.ed_fail_code);
109: } else {
110: /* Also enumerate objects allocated by my predecessors */
111: return((*(GC_old_allocator->mmp_enumerate))(ptrFree, proc, data));
112: }
113: }
114:
115: void GC_DummyFreeProc(void *p) {}
116:
117: void GC_DummyShutdownProc(void) {}
118:
119: struct PCR_MM_ProcsRep GC_Rep = {
120: MY_MAGIC,
121: GC_AllocProc,
122: GC_ReallocProc,
123: GC_DummyFreeProc, /* mmp_free */
124: GC_FreeProc, /* mmp_unsafeFree */
125: GC_EnumerateProc,
126: GC_DummyShutdownProc /* mmp_shutdown */
127: };
128:
129: struct PCR_MM_ProcsRep GC_DebugRep = {
130: MY_DEBUGMAGIC,
131: GC_DebugAllocProc,
132: GC_DebugReallocProc,
133: GC_DummyFreeProc, /* mmp_free */
134: GC_DebugFreeProc, /* mmp_unsafeFree */
135: GC_EnumerateProc,
136: GC_DummyShutdownProc /* mmp_shutdown */
137: };
138:
139: GC_bool GC_use_debug = 0;
140:
141: void GC_pcr_install()
142: {
143: PCR_MM_Install((GC_use_debug? &GC_DebugRep : &GC_Rep), &GC_old_allocator);
144: }
145:
146: PCR_ERes
147: PCR_GC_Setup(void)
148: {
149: return PCR_ERes_okay;
150: }
151:
152: PCR_ERes
153: PCR_GC_Run(void)
154: {
155:
156: if( !PCR_Base_TestPCRArg("-nogc") ) {
157: GC_quiet = ( PCR_Base_TestPCRArg("-gctrace") ? 0 : 1 );
158: GC_use_debug = (GC_bool)PCR_Base_TestPCRArg("-debug_alloc");
159: GC_init();
160: if( !PCR_Base_TestPCRArg("-nogc_incremental") ) {
161: /*
162: * awful hack to test whether VD is implemented ...
163: */
164: if( PCR_VD_Start( 0, NIL, 0) != PCR_ERes_FromErr(ENOSYS) ) {
165: GC_enable_incremental();
166: }
167: }
168: }
169: return PCR_ERes_okay;
1.2 ! noro 170: }
! 171:
! 172: void GC_push_thread_structures(void)
! 173: {
! 174: /* PCR doesn't work unless static roots are pushed. Can't get here. */
! 175: ABORT("In GC_push_thread_structures()");
1.1 noro 176: }
177:
178: # endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>