Skip to content
Snippets Groups Projects
Commit 9300f5d7 authored by ch's avatar ch
Browse files

Added code to handle transporting EQ hash tables.

parent 8cbc0df2
No related branches found
No related tags found
No related merge requests found
/* /*
* Stop and Copy GC based on Cheney's algorithm. * Stop and Copy GC based on Cheney's algorithm.
* *
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/gc.c,v 1.4 1990/05/10 17:29:15 ch Exp $ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/gc.c,v 1.5 1990/05/13 15:30:39 ch Exp $
* *
* Written by Christopher Hoover. * Written by Christopher Hoover.
*/ */
...@@ -38,7 +38,7 @@ lispobj object; ...@@ -38,7 +38,7 @@ lispobj object;
{ {
lispobj *ptr; lispobj *ptr;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
ptr = (lispobj *) PTR(object); ptr = (lispobj *) PTR(object);
...@@ -51,7 +51,7 @@ lispobj object; ...@@ -51,7 +51,7 @@ lispobj object;
{ {
lispobj *ptr; lispobj *ptr;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
ptr = (lispobj *) PTR(object); ptr = (lispobj *) PTR(object);
...@@ -92,7 +92,7 @@ int nwords; ...@@ -92,7 +92,7 @@ int nwords;
lispobj *new; lispobj *new;
lispobj *source, *dest; lispobj *source, *dest;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
gc_assert(from_space_p(object)); gc_assert(from_space_p(object));
gc_assert((nwords & 0x01) == 0); gc_assert((nwords & 0x01) == 0);
...@@ -416,7 +416,7 @@ lispobj *from_space, *from_space_free_pointer; ...@@ -416,7 +416,7 @@ lispobj *from_space, *from_space_free_pointer;
lispobj header; lispobj header;
object = *start; object = *start;
forwardp = pointerp(object) && new_space_p(object); forwardp = Pointerp(object) && new_space_p(object);
if (forwardp) { if (forwardp) {
int tag; int tag;
...@@ -464,7 +464,7 @@ static ...@@ -464,7 +464,7 @@ static
scav_function_pointer(where, object) scav_function_pointer(where, object)
lispobj *where, object; lispobj *where, object;
{ {
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
if (from_space_p(object)) { if (from_space_p(object)) {
lispobj first, *first_pointer; lispobj first, *first_pointer;
...@@ -474,7 +474,7 @@ lispobj *where, object; ...@@ -474,7 +474,7 @@ lispobj *where, object;
first_pointer = (lispobj *) PTR(object); first_pointer = (lispobj *) PTR(object);
first = *first_pointer; first = *first_pointer;
if (!(pointerp(first) && new_space_p(first))) { if (!(Pointerp(first) && new_space_p(first))) {
int type; int type;
/* must transport object -- object may point */ /* must transport object -- object may point */
...@@ -494,7 +494,7 @@ lispobj *where, object; ...@@ -494,7 +494,7 @@ lispobj *where, object;
} }
} }
gc_assert(pointerp(first)); gc_assert(Pointerp(first));
gc_assert(!from_space_p(first)); gc_assert(!from_space_p(first));
*where = first; *where = first;
...@@ -519,7 +519,7 @@ struct code *code; ...@@ -519,7 +519,7 @@ struct code *code;
/* if object has already been transported, just return pointer */ /* if object has already been transported, just return pointer */
first = code->header; first = code->header;
if (pointerp(first) && new_space_p(first)) if (Pointerp(first) && new_space_p(first))
return (struct code *) PTR(first); return (struct code *) PTR(first);
gc_assert(TypeOf(first) == type_CodeHeader); gc_assert(TypeOf(first) == type_CodeHeader);
...@@ -528,7 +528,7 @@ struct code *code; ...@@ -528,7 +528,7 @@ struct code *code;
l_code = (lispobj) code | type_OtherPointer; l_code = (lispobj) code | type_OtherPointer;
ncode_words = FIXNUM_TO_INT(code->code_size); ncode_words = FIXNUM_TO_INT(code->code_size);
nheader_words = HEADER_VALUE(code->header); nheader_words = HeaderValue(code->header);
nwords = ncode_words + nheader_words; nwords = ncode_words + nheader_words;
nwords = CEILING(nwords, 2); nwords = CEILING(nwords, 2);
...@@ -591,7 +591,7 @@ lispobj *where, object; ...@@ -591,7 +591,7 @@ lispobj *where, object;
code = (struct code *) where; code = (struct code *) where;
ncode_words = FIXNUM_TO_INT(code->code_size); ncode_words = FIXNUM_TO_INT(code->code_size);
nheader_words = HEADER_VALUE(object); nheader_words = HeaderValue(object);
nwords = ncode_words + nheader_words; nwords = ncode_words + nheader_words;
nwords = CEILING(nwords, 2); nwords = CEILING(nwords, 2);
...@@ -650,7 +650,7 @@ lispobj *where; ...@@ -650,7 +650,7 @@ lispobj *where;
code = (struct code *) where; code = (struct code *) where;
ncode_words = FIXNUM_TO_INT(code->code_size); ncode_words = FIXNUM_TO_INT(code->code_size);
nheader_words = HEADER_VALUE(code->header); nheader_words = HeaderValue(code->header);
nwords = ncode_words + nheader_words; nwords = ncode_words + nheader_words;
nwords = CEILING(nwords, 2); nwords = CEILING(nwords, 2);
...@@ -678,7 +678,7 @@ lispobj object; ...@@ -678,7 +678,7 @@ lispobj object;
struct code *code, *ncode; struct code *code, *ncode;
return_pc = (struct function_header *) PTR(object); return_pc = (struct function_header *) PTR(object);
offset = HEADER_VALUE(return_pc->header) * 4; offset = HeaderValue(return_pc->header) * 4;
/* Transport the whole code object */ /* Transport the whole code object */
code = (struct code *) ((unsigned long) return_pc - offset); code = (struct code *) ((unsigned long) return_pc - offset);
...@@ -708,7 +708,7 @@ lispobj object; ...@@ -708,7 +708,7 @@ lispobj object;
struct code *code, *ncode; struct code *code, *ncode;
fheader = (struct function_header *) PTR(object); fheader = (struct function_header *) PTR(object);
offset = HEADER_VALUE(fheader->header) * 4; offset = HeaderValue(fheader->header) * 4;
/* Transport the whole code object */ /* Transport the whole code object */
code = (struct code *) ((unsigned long) fheader - offset); code = (struct code *) ((unsigned long) fheader - offset);
...@@ -738,7 +738,7 @@ lispobj object; ...@@ -738,7 +738,7 @@ lispobj object;
struct code *code, *ncode; struct code *code, *ncode;
fheader = (struct function_header *) PTR(object); fheader = (struct function_header *) PTR(object);
offset = HEADER_VALUE(fheader->header) * 4; offset = HeaderValue(fheader->header) * 4;
/* Transport the whole code object */ /* Transport the whole code object */
code = (struct code *) ((unsigned long) fheader - offset); code = (struct code *) ((unsigned long) fheader - offset);
...@@ -772,7 +772,7 @@ static ...@@ -772,7 +772,7 @@ static
scav_list_pointer(where, object) scav_list_pointer(where, object)
lispobj *where, object; lispobj *where, object;
{ {
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
if (from_space_p(object)) { if (from_space_p(object)) {
lispobj first, *first_pointer; lispobj first, *first_pointer;
...@@ -782,10 +782,10 @@ lispobj *where, object; ...@@ -782,10 +782,10 @@ lispobj *where, object;
first_pointer = (lispobj *) PTR(object); first_pointer = (lispobj *) PTR(object);
first = *first_pointer; first = *first_pointer;
if (!(pointerp(first) && new_space_p(first))) if (!(Pointerp(first) && new_space_p(first)))
first = *first_pointer = trans_list(object); first = *first_pointer = trans_list(object);
gc_assert(pointerp(first)); gc_assert(Pointerp(first));
gc_assert(!from_space_p(first)); gc_assert(!from_space_p(first));
*where = first; *where = first;
...@@ -849,7 +849,7 @@ static ...@@ -849,7 +849,7 @@ static
scav_other_pointer(where, object) scav_other_pointer(where, object)
lispobj *where, object; lispobj *where, object;
{ {
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
if (from_space_p(object)) { if (from_space_p(object)) {
lispobj first, *first_pointer; lispobj first, *first_pointer;
...@@ -859,11 +859,11 @@ lispobj *where, object; ...@@ -859,11 +859,11 @@ lispobj *where, object;
first_pointer = (lispobj *) PTR(object); first_pointer = (lispobj *) PTR(object);
first = *first_pointer; first = *first_pointer;
if (!(pointerp(first) && new_space_p(first))) if (!(Pointerp(first) && new_space_p(first)))
first = *first_pointer = first = *first_pointer =
(transother[TypeOf(first)])(object); (transother[TypeOf(first)])(object);
gc_assert(pointerp(first)); gc_assert(Pointerp(first));
gc_assert(!from_space_p(first)); gc_assert(!from_space_p(first));
*where = first; *where = first;
...@@ -919,10 +919,10 @@ lispobj object; ...@@ -919,10 +919,10 @@ lispobj object;
lispobj header; lispobj header;
unsigned long length; unsigned long length;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
header = *((lispobj *) PTR(object)); header = *((lispobj *) PTR(object));
length = HEADER_VALUE(header) + 1; length = HeaderValue(header) + 1;
length = CEILING(length, 2); length = CEILING(length, 2);
return copy_object(object, length); return copy_object(object, length);
...@@ -936,7 +936,7 @@ lispobj *where; ...@@ -936,7 +936,7 @@ lispobj *where;
unsigned long length; unsigned long length;
header = *where; header = *where;
length = HEADER_VALUE(header) + 1; length = HeaderValue(header) + 1;
length = CEILING(length, 2); length = CEILING(length, 2);
return length; return length;
...@@ -949,7 +949,7 @@ lispobj *where, object; ...@@ -949,7 +949,7 @@ lispobj *where, object;
{ {
unsigned long length; unsigned long length;
length = HEADER_VALUE(object) + 1; length = HeaderValue(object) + 1;
length = CEILING(length, 2); length = CEILING(length, 2);
return length; return length;
...@@ -963,10 +963,10 @@ lispobj object; ...@@ -963,10 +963,10 @@ lispobj object;
unsigned long length; unsigned long length;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
header = *((lispobj *) PTR(object)); header = *((lispobj *) PTR(object));
length = HEADER_VALUE(header) + 1; length = HeaderValue(header) + 1;
length = CEILING(length, 2); length = CEILING(length, 2);
return copy_object(object, length); return copy_object(object, length);
...@@ -980,7 +980,7 @@ lispobj *where; ...@@ -980,7 +980,7 @@ lispobj *where;
unsigned long length; unsigned long length;
header = *where; header = *where;
length = HEADER_VALUE(header) + 1; length = HeaderValue(header) + 1;
length = CEILING(length, 2); length = CEILING(length, 2);
return length; return length;
...@@ -1014,7 +1014,7 @@ trans_string(object) ...@@ -1014,7 +1014,7 @@ trans_string(object)
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
/* NOTE: Strings contain one more byte of data than the length */ /* NOTE: Strings contain one more byte of data than the length */
/* slot indicates. */ /* slot indicates. */
...@@ -1050,13 +1050,23 @@ lispobj object; ...@@ -1050,13 +1050,23 @@ lispobj object;
{ {
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
int subtype;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
nwords = CEILING(length + 2, 2); nwords = CEILING(length + 2, 2);
/* When transporting an EQ hashtable, GC must change subtype */
/* so that the hash functions will know to rehash it. */
subtype = HeaderValue(vector->header);
if (subtype == subtype_VectorValidHashing)
vector->header = (subtype_VectorMustRehash<<8) |
type_SimpleVector;
return copy_object(object, nwords); return copy_object(object, nwords);
} }
...@@ -1096,7 +1106,7 @@ lispobj object; ...@@ -1096,7 +1106,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1141,7 +1151,7 @@ lispobj object; ...@@ -1141,7 +1151,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1186,7 +1196,7 @@ lispobj object; ...@@ -1186,7 +1196,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1231,7 +1241,7 @@ lispobj object; ...@@ -1231,7 +1241,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1276,7 +1286,7 @@ lispobj object; ...@@ -1276,7 +1286,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1321,7 +1331,7 @@ lispobj object; ...@@ -1321,7 +1331,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1366,7 +1376,7 @@ lispobj object; ...@@ -1366,7 +1376,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1411,7 +1421,7 @@ lispobj object; ...@@ -1411,7 +1421,7 @@ lispobj object;
struct vector *vector; struct vector *vector;
int length, nwords; int length, nwords;
gc_assert(pointerp(object)); gc_assert(Pointerp(object));
vector = (struct vector *) PTR(object); vector = (struct vector *) PTR(object);
length = FIXNUM_TO_INT(vector->length); length = FIXNUM_TO_INT(vector->length);
...@@ -1602,4 +1612,3 @@ gc_init() ...@@ -1602,4 +1612,3 @@ gc_init()
sizetab[type_Sap] = size_unboxed; sizetab[type_Sap] = size_unboxed;
sizetab[type_UnboundMarker] = size_immediate; sizetab[type_UnboundMarker] = size_immediate;
} }
/* /*
* Header file for GC * Header file for GC
* *
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/gc.h,v 1.2 1990/03/29 21:18:26 ch Exp $ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/gc.h,v 1.3 1990/05/13 15:30:58 ch Exp $
*/ */
#if !defined(_INCLUDED_GC_H_) #if !defined(_INCLUDED_GC_H_)
...@@ -19,9 +19,6 @@ extern void gc_lose(); ...@@ -19,9 +19,6 @@ extern void gc_lose();
} \ } \
} }
#define pointerp(object) ((object) & 0x01)
#define HEADER_VALUE(object) ((unsigned long) ((object)>>8))
#define CEILING(x,y) (((x) + ((y) - 1)) & (~((y) - 1))) #define CEILING(x,y) (((x) + ((y) - 1)) & (~((y) - 1)))
#define FIXNUM_TO_INT(x) ((x)>>2) #define FIXNUM_TO_INT(x) ((x)>>2)
#define INT_TO_FIXNUM(x) ((x)<<2) #define INT_TO_FIXNUM(x) ((x)<<2)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment