Annotation of OpenXM_contrib2/asir2000/gc/new_hblk.c, Revision 1.2
1.1 noro 1: /*
2: * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3: * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
4: *
5: * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
6: * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
7: *
8: * Permission is hereby granted to use or copy this program
9: * for any purpose, provided the above notices are retained on all copies.
10: * Permission to modify the code and to distribute modified code is granted,
11: * provided the above notices are retained, and a notice that the code was
12: * modified is included with the above copyright notice.
13: *
14: * This file contains the functions:
15: * ptr_t GC_build_flXXX(h, old_fl)
16: * void GC_new_hblk(n)
17: */
18: /* Boehm, May 19, 1994 2:09 pm PDT */
19:
20:
21: # include <stdio.h>
22: # include "gc_priv.h"
23:
24: #ifndef SMALL_CONFIG
25: /*
26: * Build a free list for size 1 objects inside hblk h. Set the last link to
27: * be ofl. Return a pointer tpo the first free list entry.
28: */
29: ptr_t GC_build_fl1(h, ofl)
30: struct hblk *h;
31: ptr_t ofl;
32: {
33: register word * p = (word *)h;
34: register word * lim = (word *)(h + 1);
35:
36: p[0] = (word)ofl;
37: p[1] = (word)(p);
38: p[2] = (word)(p+1);
39: p[3] = (word)(p+2);
40: p += 4;
41: for (; p < lim; p += 4) {
42: p[0] = (word)(p-1);
43: p[1] = (word)(p);
44: p[2] = (word)(p+1);
45: p[3] = (word)(p+2);
46: };
47: return((ptr_t)(p-1));
48: }
49:
50: /* The same for size 2 cleared objects */
51: ptr_t GC_build_fl_clear2(h, ofl)
52: struct hblk *h;
53: ptr_t ofl;
54: {
55: register word * p = (word *)h;
56: register word * lim = (word *)(h + 1);
57:
58: p[0] = (word)ofl;
59: p[1] = 0;
60: p[2] = (word)p;
61: p[3] = 0;
62: p += 4;
63: for (; p < lim; p += 4) {
64: p[0] = (word)(p-2);
65: p[1] = 0;
66: p[2] = (word)p;
67: p[3] = 0;
68: };
69: return((ptr_t)(p-2));
70: }
71:
72: /* The same for size 3 cleared objects */
73: ptr_t GC_build_fl_clear3(h, ofl)
74: struct hblk *h;
75: ptr_t ofl;
76: {
77: register word * p = (word *)h;
78: register word * lim = (word *)(h + 1) - 2;
79:
80: p[0] = (word)ofl;
81: p[1] = 0;
82: p[2] = 0;
83: p += 3;
84: for (; p < lim; p += 3) {
85: p[0] = (word)(p-3);
86: p[1] = 0;
87: p[2] = 0;
88: };
89: return((ptr_t)(p-3));
90: }
91:
92: /* The same for size 4 cleared objects */
93: ptr_t GC_build_fl_clear4(h, ofl)
94: struct hblk *h;
95: ptr_t ofl;
96: {
97: register word * p = (word *)h;
98: register word * lim = (word *)(h + 1);
99:
100: p[0] = (word)ofl;
101: p[1] = 0;
102: p[2] = 0;
103: p[3] = 0;
104: p += 4;
105: for (; p < lim; p += 4) {
1.2 ! noro 106: PREFETCH_FOR_WRITE(p+64);
1.1 noro 107: p[0] = (word)(p-4);
108: p[1] = 0;
1.2 ! noro 109: CLEAR_DOUBLE(p+2);
1.1 noro 110: };
111: return((ptr_t)(p-4));
112: }
113:
114: /* The same for size 2 uncleared objects */
115: ptr_t GC_build_fl2(h, ofl)
116: struct hblk *h;
117: ptr_t ofl;
118: {
119: register word * p = (word *)h;
120: register word * lim = (word *)(h + 1);
121:
122: p[0] = (word)ofl;
123: p[2] = (word)p;
124: p += 4;
125: for (; p < lim; p += 4) {
126: p[0] = (word)(p-2);
127: p[2] = (word)p;
128: };
129: return((ptr_t)(p-2));
130: }
131:
132: /* The same for size 4 uncleared objects */
133: ptr_t GC_build_fl4(h, ofl)
134: struct hblk *h;
135: ptr_t ofl;
136: {
137: register word * p = (word *)h;
138: register word * lim = (word *)(h + 1);
139:
140: p[0] = (word)ofl;
141: p[4] = (word)p;
142: p += 8;
143: for (; p < lim; p += 8) {
1.2 ! noro 144: PREFETCH_FOR_WRITE(p+64);
1.1 noro 145: p[0] = (word)(p-4);
146: p[4] = (word)p;
147: };
148: return((ptr_t)(p-4));
149: }
150:
151: #endif /* !SMALL_CONFIG */
152:
153: /*
154: * Allocate a new heapblock for small objects of size n.
155: * Add all of the heapblock's objects to the free list for objects
156: * of that size.
157: * Set all mark bits if objects are uncollectable.
158: * Will fail to do anything if we are out of memory.
159: */
160: void GC_new_hblk(sz, kind)
161: register word sz;
162: int kind;
163: {
164: register word *p,
165: *prev;
166: word *last_object; /* points to last object in new hblk */
167: register struct hblk *h; /* the new heap block */
168: register GC_bool clear = GC_obj_kinds[kind].ok_init;
169:
170: # ifdef PRINTSTATS
171: if ((sizeof (struct hblk)) > HBLKSIZE) {
172: ABORT("HBLK SZ inconsistency");
173: }
174: # endif
175:
176: /* Allocate a new heap block */
177: h = GC_allochblk(sz, kind, 0);
178: if (h == 0) return;
179:
180: /* Mark all objects if appropriate. */
181: if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h));
182:
1.2 ! noro 183: PREFETCH_FOR_WRITE((char *)h);
! 184: PREFETCH_FOR_WRITE((char *)h + 128);
! 185: PREFETCH_FOR_WRITE((char *)h + 256);
! 186: PREFETCH_FOR_WRITE((char *)h + 378);
1.1 noro 187: /* Handle small objects sizes more efficiently. For larger objects */
188: /* the difference is less significant. */
189: # ifndef SMALL_CONFIG
190: switch (sz) {
191: case 1: GC_obj_kinds[kind].ok_freelist[1] =
192: GC_build_fl1(h, GC_obj_kinds[kind].ok_freelist[1]);
193: return;
194: case 2: if (clear) {
195: GC_obj_kinds[kind].ok_freelist[2] =
196: GC_build_fl_clear2(h, GC_obj_kinds[kind].ok_freelist[2]);
197: } else {
198: GC_obj_kinds[kind].ok_freelist[2] =
199: GC_build_fl2(h, GC_obj_kinds[kind].ok_freelist[2]);
200: }
201: return;
202: case 3: if (clear) {
203: GC_obj_kinds[kind].ok_freelist[3] =
204: GC_build_fl_clear3(h, GC_obj_kinds[kind].ok_freelist[3]);
205: return;
206: } else {
207: /* It's messy to do better than the default here. */
208: break;
209: }
210: case 4: if (clear) {
211: GC_obj_kinds[kind].ok_freelist[4] =
212: GC_build_fl_clear4(h, GC_obj_kinds[kind].ok_freelist[4]);
213: } else {
214: GC_obj_kinds[kind].ok_freelist[4] =
215: GC_build_fl4(h, GC_obj_kinds[kind].ok_freelist[4]);
216: }
217: return;
218: default:
219: break;
220: }
221: # endif /* !SMALL_CONFIG */
222:
223: /* Clear the page if necessary. */
224: if (clear) BZERO(h, HBLKSIZE);
225:
226: /* Add objects to free list */
227: p = &(h -> hb_body[sz]); /* second object in *h */
228: prev = &(h -> hb_body[0]); /* One object behind p */
229: last_object = (word *)((char *)h + HBLKSIZE);
230: last_object -= sz;
231: /* Last place for last object to start */
232:
233: /* make a list of all objects in *h with head as last object */
234: while (p <= last_object) {
235: /* current object's link points to last object */
236: obj_link(p) = (ptr_t)prev;
237: prev = p;
238: p += sz;
239: }
240: p -= sz; /* p now points to last object */
241:
242: /*
243: * put p (which is now head of list of objects in *h) as first
244: * pointer in the appropriate free list for this size.
245: */
246: obj_link(h -> hb_body) = GC_obj_kinds[kind].ok_freelist[sz];
247: GC_obj_kinds[kind].ok_freelist[sz] = ((ptr_t)p);
248: }
249:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>