[BACK]Return to new_hblk.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc

Annotation of OpenXM_contrib2/asir2000/gc/new_hblk.c, Revision 1.1.1.1

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) {
                    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>