Annotation of OpenXM_contrib/gc/new_hblk.c, Revision 1.1
1.1 ! maekawa 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) {
! 106: p[0] = (word)(p-4);
! 107: p[1] = 0;
! 108: p[2] = 0;
! 109: p[3] = 0;
! 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) {
! 144: p[0] = (word)(p-4);
! 145: p[4] = (word)p;
! 146: };
! 147: return((ptr_t)(p-4));
! 148: }
! 149:
! 150: #endif /* !SMALL_CONFIG */
! 151:
! 152: /*
! 153: * Allocate a new heapblock for small objects of size n.
! 154: * Add all of the heapblock's objects to the free list for objects
! 155: * of that size.
! 156: * Set all mark bits if objects are uncollectable.
! 157: * Will fail to do anything if we are out of memory.
! 158: */
! 159: void GC_new_hblk(sz, kind)
! 160: register word sz;
! 161: int kind;
! 162: {
! 163: register word *p,
! 164: *prev;
! 165: word *last_object; /* points to last object in new hblk */
! 166: register struct hblk *h; /* the new heap block */
! 167: register GC_bool clear = GC_obj_kinds[kind].ok_init;
! 168:
! 169: # ifdef PRINTSTATS
! 170: if ((sizeof (struct hblk)) > HBLKSIZE) {
! 171: ABORT("HBLK SZ inconsistency");
! 172: }
! 173: # endif
! 174:
! 175: /* Allocate a new heap block */
! 176: h = GC_allochblk(sz, kind, 0);
! 177: if (h == 0) return;
! 178:
! 179: /* Mark all objects if appropriate. */
! 180: if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h));
! 181:
! 182: /* Handle small objects sizes more efficiently. For larger objects */
! 183: /* the difference is less significant. */
! 184: # ifndef SMALL_CONFIG
! 185: switch (sz) {
! 186: case 1: GC_obj_kinds[kind].ok_freelist[1] =
! 187: GC_build_fl1(h, GC_obj_kinds[kind].ok_freelist[1]);
! 188: return;
! 189: case 2: if (clear) {
! 190: GC_obj_kinds[kind].ok_freelist[2] =
! 191: GC_build_fl_clear2(h, GC_obj_kinds[kind].ok_freelist[2]);
! 192: } else {
! 193: GC_obj_kinds[kind].ok_freelist[2] =
! 194: GC_build_fl2(h, GC_obj_kinds[kind].ok_freelist[2]);
! 195: }
! 196: return;
! 197: case 3: if (clear) {
! 198: GC_obj_kinds[kind].ok_freelist[3] =
! 199: GC_build_fl_clear3(h, GC_obj_kinds[kind].ok_freelist[3]);
! 200: return;
! 201: } else {
! 202: /* It's messy to do better than the default here. */
! 203: break;
! 204: }
! 205: case 4: if (clear) {
! 206: GC_obj_kinds[kind].ok_freelist[4] =
! 207: GC_build_fl_clear4(h, GC_obj_kinds[kind].ok_freelist[4]);
! 208: } else {
! 209: GC_obj_kinds[kind].ok_freelist[4] =
! 210: GC_build_fl4(h, GC_obj_kinds[kind].ok_freelist[4]);
! 211: }
! 212: return;
! 213: default:
! 214: break;
! 215: }
! 216: # endif /* !SMALL_CONFIG */
! 217:
! 218: /* Clear the page if necessary. */
! 219: if (clear) BZERO(h, HBLKSIZE);
! 220:
! 221: /* Add objects to free list */
! 222: p = &(h -> hb_body[sz]); /* second object in *h */
! 223: prev = &(h -> hb_body[0]); /* One object behind p */
! 224: last_object = (word *)((char *)h + HBLKSIZE);
! 225: last_object -= sz;
! 226: /* Last place for last object to start */
! 227:
! 228: /* make a list of all objects in *h with head as last object */
! 229: while (p <= last_object) {
! 230: /* current object's link points to last object */
! 231: obj_link(p) = (ptr_t)prev;
! 232: prev = p;
! 233: p += sz;
! 234: }
! 235: p -= sz; /* p now points to last object */
! 236:
! 237: /*
! 238: * put p (which is now head of list of objects in *h) as first
! 239: * pointer in the appropriate free list for this size.
! 240: */
! 241: obj_link(h -> hb_body) = GC_obj_kinds[kind].ok_freelist[sz];
! 242: GC_obj_kinds[kind].ok_freelist[sz] = ((ptr_t)p);
! 243: }
! 244:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>