Author: heimdall
Date: Tue Sep 13 08:24:15 2005
New Revision: 9192
Modified:
branches/gmc/include/parrot/dod.h
branches/gmc/include/parrot/pobj.h
branches/gmc/include/parrot/smallobject.h
branches/gmc/include/parrot/stacks.h
branches/gmc/src/gc_gmc.c
branches/gmc/src/jit_debug.c
branches/gmc/src/string.c
Log:
Changed data structures to use structs, cleaned macros, changed API to make
more sense. Possibly added some alignment problems as all the checking code has
been moved (but partially using structs should solve at least part of these
problems by letting the compiler handle them).
Modified: branches/gmc/include/parrot/dod.h
==============================================================================
--- branches/gmc/include/parrot/dod.h (original)
+++ branches/gmc/include/parrot/dod.h Tue Sep 13 08:24:15 2005
@@ -161,8 +161,8 @@ void parrot_gc_gms_wb_key(Interp *, PMC
UINTVAL agg_body, new_body; \
if (!(new) || (new) == (void*)PMCNULL) \
break; \
- agg_body = (UINTVAL)PMC_body(agg); \
- new_body = (UINTVAL)PMC_body((PMC*)new); \
+ agg_body = (UINTVAL)Gmc_POBJ_get_OBJ(agg); \
+ new_body = (UINTVAL)Gmc_POBJ_get_OBJ((PMC*)new); \
if (agg_body > new_body) \
gc_gmc_wb(interp, agg, old, new); \
} while (0)
@@ -170,9 +170,9 @@ void parrot_gc_gms_wb_key(Interp *, PMC
UINTVAL agg_body, new_body, key_body; \
if (!(new) || (new) == (void*)PMCNULL) \
break; \
- agg_body = (UINTVAL)PMC_body(agg); \
- new_body = (UINTVAL)PMC_body((PObj*)new); \
- key_body = (UINTVAL)PMC_body((PObj*)new_key); \
+ agg_body = (UINTVAL)Gmc_POBJ_get_OBJ(agg); \
+ new_body = (UINTVAL)Gmc_POBJ_get_OBJ((PObj*)new); \
+ key_body = (UINTVAL)Gmc_POBJ_get_OBJ((PObj*)new_key); \
if (agg_body > new_body || agg_body > key_body) \
gc_gmc_wb_key(interp, agg, old, old_key, new, new_key); \
} while (0)
Modified: branches/gmc/include/parrot/pobj.h
==============================================================================
--- branches/gmc/include/parrot/pobj.h (original)
+++ branches/gmc/include/parrot/pobj.h Tue Sep 13 08:24:15 2005
@@ -118,7 +118,11 @@ typedef struct Buffer {
* we have it in the body, we need it to be allocated if we want to access
* it. */
Parrot_UInt flags;
- pobj_body *body;
+ /* We declare bodw as a void * for now. It's a Gc_gmc_obj * in reality but
+ * the order of inclusion of headers did not make this declaration possible
+ * (or at least not simply). The cast is done in Gmc_POBJ_get_OBJ,
+ * include/parrot/smallobject.h */
+ void *obj;
} Buffer;
#else
@@ -133,15 +137,14 @@ typedef Buffer PObj;
#if PARROT_GC_GMC
-#define PMC_body(pmc) (pmc)->body
-#define PObj_bufstart(pmc) PMC_body(pmc)->u._b._bufstart
-#define PObj_buflen(pmc) PMC_body(pmc)->u._b._buflen
-#define PMC_struct_val(pmc) PMC_body(pmc)->u._ptrs._struct_val
-#define PMC_pmc_val(pmc) PMC_body(pmc)->u._ptrs._pmc_val
-#define PMC_int_val(pmc) PMC_body(pmc)->u._i._int_val
-#define PMC_int_val2(pmc) PMC_body(pmc)->u._i._int_val2
-#define PMC_num_val(pmc) PMC_body(pmc)->u._num_val
-#define PMC_str_val(pmc) PMC_body(pmc)->u._string_val
+#define PObj_bufstart(pmc) Gmc_POBJ_get_BODY(pmc,
pobj_body*)->u._b._bufstart
+#define PObj_buflen(pmc) Gmc_POBJ_get_BODY(pmc,pobj_body*)->u._b._buflen
+#define PMC_struct_val(pmc)
Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._ptrs._struct_val
+#define PMC_pmc_val(pmc)
Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._ptrs._pmc_val
+#define PMC_int_val(pmc) Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._i._int_val
+#define PMC_int_val2(pmc) Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._i._int_val2
+#define PMC_num_val(pmc) Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._num_val
+#define PMC_str_val(pmc) Gmc_POBJ_get_BODY(pmc,PMC_BODY*)->u._string_val
#else
@@ -167,9 +170,9 @@ typedef Buffer PObj;
#if ! DISABLE_GC_DEBUG
/* BEGIN DEPRECATED POBJ ACCESSOR */
-# define pobj_version body->_pobj_version
+# define pobj_version ((Gc_gmc_obj*)obj)->body->_pobj_version
/* END DEPRECATED POBJ ACCESSOR */
-# define PObj_version(pobj) (pobj)->body->_pobj_version
+# define PObj_version(pobj) Gmc_POBJ_get_BODY(pobj,pobj_body*)->_pobj_version
#endif /* ! DISABLE_GC_DEBUG */
#else
@@ -193,7 +196,7 @@ typedef enum {
struct parrot_string_t {
#if PARROT_GC_GMC
Parrot_UInt flags;
- PMC_BODY *body;
+ void *obj;
#else
pobj_t obj;
#endif
@@ -219,7 +222,7 @@ struct parrot_string_t {
struct PMC {
#if PARROT_GC_GMC
Parrot_UInt flags;
- PMC_BODY *body;
+ void *obj;
#else
pobj_t obj;
#endif
@@ -268,12 +271,12 @@ typedef struct PMC_EXT PMC_EXT;
#if PARROT_GC_GMC
-#define PMC_data(pmc) (PMC_body(pmc)->data)
+#define PMC_data(pmc)
((PMC_BODY*)Gmc_POBJ_get_BODY(pmc,PMC_BODY*))->data
#define PMC_data0(pmc) PMC_data(pmc)
-#define PMC_metadata(pmc) PMC_body(pmc)->_metadata
-#define PMC_next_for_GC(pmc) PMC_body(pmc)->_next_for_GC
-#define PMC_sync(pmc) PMC_body(pmc)->_synchronize
-#define PMC_union(pmc) PMC_body(pmc)->u
+#define PMC_metadata(pmc)
((PMC_BODY*)Gmc_POBJ_get_BODY(pmc,PMC_BODY*))->_metadata
+#define PMC_next_for_GC(pmc)
((PMC_BODY*)Gmc_POBJ_get_BODY(pmc,PMC_BODY*))->_next_for_GC
+#define PMC_sync(pmc)
((PMC_BODY*)Gmc_POBJ_get_BODY(pmc,PMC_BODY*))->_synchronize
+#define PMC_union(pmc) ((PMC_BODY*)Gmc_POBJ_get_BODY(pmc,PMC_BODY*))->u
#else
Modified: branches/gmc/include/parrot/smallobject.h
==============================================================================
--- branches/gmc/include/parrot/smallobject.h (original)
+++ branches/gmc/include/parrot/smallobject.h Tue Sep 13 08:24:15 2005
@@ -146,12 +146,6 @@ typedef struct _gc_gmc_hdr_list {
} Gc_gmc_hdr_list;
-typedef struct _gc_gmc_header_area {
- void *fst;
- void *lst;
-} Gc_gmc_header_area;
-
-
/* A generation for GMC. */
typedef struct _gc_gmc_gen {
struct _gc_gmc_gen *next; /* Next generation in the linked list. */
@@ -165,14 +159,48 @@ typedef struct _gc_gmc_gen {
Gc_gmc_hdr_list *IGP; /* Inter Generational pointers set. */
} Gc_gmc_gen;
+
/* This header is appended to all gc objects. */
-typedef struct _gc_gmc_hdr {
+typedef struct _gc_gmc_obj_hdr {
UINTVAL flags;
- PMC* pmc; /* Corresponding PMC header. */
+ /* We use the PMC* type because PObj* is included in it, so that avoids us
+ * some casts and is safe as a PObj should never access the fields of a
PMC. */
+ PMC* pobj; /* Corresponding PMC header. */
Gc_gmc_gen *gen; /* Generation it belongs to. */
-} Gc_gmc_hdr;
+} Gc_gmc_obj_hdr;
+
+/* This is a 'complete' PMC body (obj_header + data). We will call it an
object. */
+/* Body (the data) is declared as a char to be as general as possible. */
+typedef struct _gc_gmc_obj {
+ Gc_gmc_obj_hdr hdr;
+ char body[];
+} Gc_gmc_obj;
+
+/* Macros for access from Obj */
+#define Gmc_OBJ_get_HDR(o) (o)->hdr
+/* Semantically, this is the same as (type)((o)->body) but if we state it like
+ * this, gcc (and possibly other compilers) complains about lvalue cast.
+ * However, we can't use LVALUE_CAST here, as body is a char[] and thus,
+ * accessing &(o)->body does not work as expected (see the definitions of
+ * LVALUE_CAST. */
+#define Gmc_OBJ_get_BODY(o,type) ((type)((char*)o +
offsetof(Gc_gmc_obj,body)))
+#define Gmc_OBJ_get_POBJ(o) Gmc_OBJ_get_HDR(o).pobj
+#define Gmc_OBJ_get_GEN(o) ((Gc_gmc_gen
*)((UINTVAL)(Gmc_OBJ_get_HDR(o).gen) & ~1))
+#define Gmc_OBJ_set_GEN(o,speck) Gmc_OBJ_get_HDR(o).gen =
(Gc_gmc_gen *) \
+ ((UINTVAL)speck | \
+
((UINTVAL)Gmc_OBJ_get_HDR(o).gen & 1))
+
+/*((PMC_BODY*)((Gc_gmc_obj*)(buffer)->obj)->body)*/
+
+/* Macros for access from PObj* */
+#define Gmc_POBJ_get_OBJ(p)
LVALUE_CAST(Gc_gmc_obj*,(p)->obj)
+#define Gmc_POBJ_get_HDR(p)
Gmc_OBJ_get_HDR(Gmc_POBJ_get_OBJ(p))
+#define Gmc_POBJ_get_BODY(p,type)
Gmc_OBJ_get_BODY(Gmc_POBJ_get_OBJ(p), type)
+#define Gmc_POBJ_get_GEN(p)
Gmc_OBJ_get_GEN(Gmc_POBJ_get_OBJ(p))
+#define Gmc_POBJ_set_GEN(p,speck)
Gmc_OBJ_set_GEN(Gmc_POBJ_get_OBJ(p), speck)
+#if 0
/* Macros for access from header. */
#define Gmc_PMC_hdr_get_BODY(pmc_hdr)
((PMC_BODY*)((char*)(pmc_hdr) + Gmc_align(sizeof(Gc_gmc_hdr))))
#define Gmc_PMC_hdr_get_PMC(pmc_hdr) (pmc_hdr)->pmc
@@ -190,6 +218,7 @@ typedef struct _gc_gmc_hdr {
#define Gmc_PMC_get_HDR(pmc)
Gmc_PMC_body_get_HDR(PMC_body(pmc))
#define Gmc_PMC_get_GEN(pmc)
Gmc_PMC_hdr_get_GEN(Gmc_PMC_get_HDR(pmc))
#define Gmc_PMC_set_GEN(pmc,gen)
Gmc_PMC_hdr_get_GEN(Gmc_PMC_get_HDR(pmc),gen)
+#endif
#define PObj_exists_PMC_EXT_TEST(pmc) (PObj_is_PMC_EXT_TEST(pmc)
&& (UINTVAL)PMC_data(pmc) != 0xdeadbeef)
#define PObj_exists_PMC_EXT_SET(pmc) do { \
@@ -198,18 +227,12 @@ typedef struct _gc_gmc_hdr {
} while (0)
#define PObj_exists_PMC_EXT_CLEAR(pmc) PMC_data(pmc) =
(void*)0xdeadbeef
-#define PObj_igp_TEST(pmc)
((UINTVAL)Gmc_PMC_get_GEN(pmc) & 1)
-#define PObj_igp_SET(pmc) Gmc_PMC_get_HDR(pmc)->gen =
\
-
(Gc_gmc_gen*)((UINTVAL)Gmc_PMC_get_GEN(pmc) | 1)
-#define PObj_igp_CLEAR(pmc) Gmc_PMC_get_HDR(pmc)->gen =
\
-
(Gc_gmc_gen*)((UINTVAL)Gmc_PMC_get_GEN(pmc) & ~1)
-
-
-
+#define PObj_igp_TEST(pmc)
((UINTVAL)Gmc_POBJ_get_GEN(pmc) & 1)
+#define PObj_igp_SET(pmc) Gmc_POBJ_get_HDR(pmc).gen =
\
+
(Gc_gmc_gen*)((UINTVAL)Gmc_POBJ_get_GEN(pmc) | 1)
+#define PObj_igp_CLEAR(pmc) Gmc_POBJ_get_HDR(pmc).gen =
\
+
(Gc_gmc_gen*)((UINTVAL)Gmc_POBJ_get_GEN(pmc) & ~1)
-UINTVAL gc_gmc_bitmap_test(gmc_bitmap, UINTVAL);
-void gc_gmc_bitmap_set(gmc_bitmap, UINTVAL);
-void gc_gmc_bitmap_clear(gmc_bitmap, UINTVAL);
void Parrot_exit_scope(Interp*);
#define GMC_NORMAL_STATE 0
@@ -228,7 +251,7 @@ typedef struct _gc_gmc {
Gc_gmc_gen *old_fst; /* Beginning of non-aggregate, old objects. */
Gc_gmc_gen *old_lst; /* Very last generation. */
void *gray; /* Current object being examined during M&S. */
- Gc_gmc_hdr *hdr_ref; /* Current IGP start. */
+ Gc_gmc_obj *hdr_ref; /* Current IGP start. */
struct _gc_gmc *dummy_gc; /* For use in gc_gmc_more_bodies */
} Gc_gmc;
Modified: branches/gmc/include/parrot/stacks.h
==============================================================================
--- branches/gmc/include/parrot/stacks.h (original)
+++ branches/gmc/include/parrot/stacks.h Tue Sep 13 08:24:15 2005
@@ -26,7 +26,7 @@ typedef struct Stack_Entry {
typedef struct Stack_Chunk {
#if PARROT_GC_GMC
Parrot_UInt flags;
- pobj_body *body;
+ void *obj;
#else
pobj_t obj;
#endif
Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c (original)
+++ branches/gmc/src/gc_gmc.c Tue Sep 13 08:24:15 2005
@@ -219,8 +219,11 @@ of them. If not, we don't touch anything
#if PARROT_GC_GMC
-/*#define BIG_DUMP*/
-/*#define GMC_DEBUG*/
+/*#define BIG_DUMP
+#define GMC_DEBUG*/
+
+/* Beware that this is really *huge* output (more than 1Go even on small
runs). */
+/*#define HUGE_DUMP*/
/*#define GMC_NO_GC_RUN*/
@@ -312,11 +315,8 @@ gc_gmc_gen_init(Interp *interpreter, str
gen = mem_sys_allocate(sizeof(Gc_gmc_gen));
gen->first = mem_sys_allocate(GMC_GEN_SIZE);
- assert(!((UINTVAL)gen % GMC_ALIGN));
- assert(!((UINTVAL)gen->first % GMC_ALIGN));
/* Move gen->first to the END of the allocated zone. */
gen->first = (void*)((char*)gen->first + GMC_GEN_SIZE);
- assert(!((UINTVAL)gen->first % GMC_ALIGN));
/* And fill the blanks. */
gen->fst_free = gen->first;
@@ -351,18 +351,7 @@ gc_gmc_test_linked_list_gen(Interp *inte
UINTVAL i,j;
for (i = 0, gen = gc->old_fst; gen; i++, gen = gen->next);
for (j = 0, gen = gc->yng_lst; gen; j++, gen = gen->prev);
- if (i != gc->nb_gen || j != gc->nb_gen)
- {
-#ifdef GMC_DEBUG
- fprintf(stderr, "Invalid linked list\n");
-#endif
- gen = NULL;
- *(int*)gen = 54;
- }
-#ifdef GMC_DEBUG
- else
- fprintf(stderr, "Linked list is OK !\n");
-#endif
+ assert(i == gc->nb_gen && j == gc->nb_gen);
}
/* Inserts the given generation to the right place, keeping all generation
@@ -509,6 +498,8 @@ gc_gmc_pool_deinit(Interp *interpreter,
mem_sys_free(gen);
gen = gen_nxt;
}
+
+ mem_sys_free(pool->gc);
}
@@ -585,15 +576,15 @@ I<NB> : this function has no hook in the
/* Determines the size of a PMC according to its header. */
static size_t
-gc_gmc_get_size(Gc_gmc_hdr *hdr)
+gc_gmc_get_size(Gc_gmc_obj *obj)
{
size_t size;
/* Align header and body to multiples of GMC_ALIGN. */
- size = Gmc_align(sizeof(Gc_gmc_hdr));
- if (PObj_is_PMC_TEST(Gmc_PMC_hdr_get_PMC(hdr)))
- size += Gmc_align(Gmc_PMC_hdr_get_PMC(hdr)->vtable->size);
+ size = sizeof(Gc_gmc_obj);
+ if (PObj_is_PMC_TEST(Gmc_OBJ_get_POBJ(obj)))
+ size += ((PMC*)(Gmc_OBJ_get_POBJ(obj)))->vtable->size;
else
- size += Gmc_align(sizeof(pobj_body));
+ size += sizeof(pobj_body);
return size;
}
@@ -601,12 +592,12 @@ gc_gmc_get_size(Gc_gmc_hdr *hdr)
/* Returns the next header in the area, assuming that we have not gone further
- * than gen->fst_free. */
-static Gc_gmc_hdr *
-gc_gmc_next_hdr(Gc_gmc_hdr *hdr)
+ * than gen->first. */
+ static Gc_gmc_obj *
+gc_gmc_next_obj(Gc_gmc_obj *obj)
{
- size_t size = gc_gmc_get_size(hdr);
- return (Gc_gmc_hdr*)((char*)hdr + size);
+ size_t size = gc_gmc_get_size(obj);
+ return (Gc_gmc_obj*)((char*)obj + size);
}
@@ -615,20 +606,17 @@ gc_gmc_next_hdr(Gc_gmc_hdr *hdr)
gc_gmc_add_free_object(Interp *interpreter,
struct Small_Object_Pool *pool, void *to_add)
{
-#ifdef BIG_DUMP
- fprintf(stderr, "Adding %p\n", to_add);
-#endif
*(void**)to_add = pool->free_list;
pool->free_list = to_add;
}
/* Allocate a body of the required size. */
-static Gc_gmc_hdr *
+static Gc_gmc_obj *
gc_gmc_new_body(Interp *interpreter,
struct Small_Object_Pool *pool, size_t size, INTVAL aggreg)
{
- Gc_gmc_hdr *hdr;
+ Gc_gmc_obj *obj;
void *ptr;
UINTVAL i;
Gc_gmc *gc = pool->gc;
@@ -664,16 +652,17 @@ gc_gmc_new_body(Interp *interpreter,
}
gen->fst_free = (void*)((char*)gen->fst_free - size);
- hdr = gen->fst_free;
+ obj = gen->fst_free;
gen->remaining -= size;
gen->alloc_obj++;
- memset(hdr, 0, size);
- Gmc_PMC_hdr_set_GEN(hdr, gen);
- assert(!(size % GMC_ALIGN));
- assert(!((UINTVAL)hdr % GMC_ALIGN));
- assert(!((UINTVAL)Gmc_PMC_hdr_get_BODY(hdr) % GMC_ALIGN));
-
- return hdr;
+ memset(obj, 0, size);
+ Gmc_OBJ_set_GEN(obj, gen);
+ /*assert(!(size % GMC_ALIGN));*/
+ /*assert(!((UINTVAL)obj % GMC_ALIGN));*/
+ /*fprintf(stderr, "offset: %d\n", offsetof(Gc_gmc_obj, body));*/
+ /*assert(!((UINTVAL)Gmc_OBJ_get_BODY(obj,PMC_BODY*) % GMC_ALIGN));*/
+
+ return obj;
}
@@ -683,30 +672,35 @@ gc_gmc_new_body(Interp *interpreter,
gc_gmc_get_free_object_of_size(Interp *interpreter,
struct Small_Object_Pool *pool, size_t size, INTVAL aggreg)
{
- Gc_gmc_hdr *hdr;
- void *obj;
+ Gc_gmc_obj *obj;
+ PMC *pobj;
void *ptr, *old_flist;
struct Small_Object_Arena *arena;
- hdr = gc_gmc_new_body(interpreter, pool, size, aggreg);
+
+#ifdef HUGE_DUMP
+ for (ptr = pool->free_list; ptr && *(void**)ptr; ptr = *(void**)ptr)
+ assert(ptr != 0x1);
+#endif
+ obj = gc_gmc_new_body(interpreter, pool, size, aggreg);
if (!pool->free_list)
(*pool->more_objects)(interpreter, pool);
- obj = pool->free_list;
+ pobj = pool->free_list;
pool->free_list = *(void**)pool->free_list;
- PObj_flags_SETTO((PObj*)obj, 0);
+ PObj_flags_SETTO(pobj, 0);
pool->num_free_objects--;
- PMC_body((PMC*)obj) = Gmc_PMC_hdr_get_BODY(hdr);
- Gmc_PMC_hdr_get_PMC(hdr) = obj;
- assert(obj);
+ Gmc_POBJ_get_OBJ(pobj) = obj;
+ Gmc_OBJ_get_POBJ(obj) = pobj;
+ assert(pobj);
#ifdef BIG_DUMP
- fprintf(stderr, "Allocated obj %p -> (%p, %p) (pool %p, new free_list:
%p)\n", obj, hdr, Gmc_PMC_hdr_get_BODY(hdr), pool, pool->free_list);
+ fprintf(stderr, "Allocated obj %p -> (%p, %p) (pool %p, new free_list:
%p)\n", pobj, obj, Gmc_OBJ_get_BODY(obj,PMC_BODY*), pool, pool->free_list);
#endif
- return obj;
+ return pobj;
}
@@ -716,7 +710,7 @@ gc_gmc_get_free_object_of_size(Interp *i
gc_gmc_get_free_object(Interp *interpreter,
struct Small_Object_Pool *pool)
{
- size_t size = Gmc_align(sizeof(Gc_gmc_hdr)) + Gmc_align(sizeof(pobj_body));
+ size_t size = sizeof(Gc_gmc_obj) + sizeof(pobj_body);
PMC *pmc = gc_gmc_get_free_object_of_size(interpreter, pool, size, 0);
return pmc;
}
@@ -729,7 +723,7 @@ gc_gmc_get_free_sized_object(Interp *int
struct Small_Object_Pool *pool, size_t size)
{
int i;
- size_t nsize = Gmc_align(sizeof(Gc_gmc_hdr)) + Gmc_align(size);
+ size_t nsize = sizeof(Gc_gmc_obj) + size;
PMC *pmc = gc_gmc_get_free_object_of_size (interpreter, pool,
nsize, 0);
return pmc;
@@ -744,7 +738,7 @@ gc_gmc_get_free_typed_object(Interp *int
Gc_gmc *gc = pool->gc;
VTABLE *vtable = Parrot_base_vtables[base_type];
INTVAL aggreg = vtable->flags & VTABLE_PMC_NEEDS_EXT;
- size_t size = Gmc_align(sizeof(Gc_gmc_hdr)) + Gmc_align(vtable->size);
+ size_t size = sizeof(Gc_gmc_obj) + vtable->size;
PMC *pmc = gc_gmc_get_free_object_of_size (interpreter, pool, size,
aggreg);
return pmc;
}
@@ -773,7 +767,7 @@ gc_gmc_alloc_objects(Interp *interpreter
ptr += pool->object_size)
{
#ifdef BIG_DUMP
- fprintf(stderr, "Adding ptr %p to the list of freshly allocated
objects\n", ptr);
+ fprintf(stderr, "Adding ptr %p to the list of freshly allocated objects
for pool %p\n", ptr, pool);
#endif
(*pool->add_free_object)(interpreter,pool,ptr);
}
@@ -788,6 +782,13 @@ gc_gmc_alloc_objects(Interp *interpreter
fprintf(stderr, "Allocated new objects at arena %p, %p\n",
new_arena, new_arena->start_objects);
#endif
+
+#ifdef BIG_DUMP
+ fprintf(stderr, "Dumping free_list\n");
+ for (ptr = pool->free_list; *(void**)ptr; ptr = *(void**)ptr)
+ fprintf(stderr, "%p -> ", ptr);
+ fprintf(stderr, "%p -> NULL\n", ptr);
+#endif
}
@@ -810,7 +811,7 @@ gc_gmc_more_objects(Interp *interpreter,
gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gmc_gen *dest)
{
INTVAL offset = (char*)from->first - (char*)from->fst_free;
- Gc_gmc_hdr *ptr;
+ Gc_gmc_obj *obj;
void *start1, *start2;
start1 = (char*)dest->fst_free - dest->remaining;
@@ -824,18 +825,18 @@ gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gm
from, from->first, dest, dest->first);
#endif
memcpy(start1, start2, GMC_GEN_SIZE);
- ptr = dest->fst_free;
- while ((UINTVAL)ptr < (UINTVAL)dest->first)
+ obj = dest->fst_free;
+ while ((UINTVAL)obj < (UINTVAL)dest->first)
{
#ifdef BIG_DUMP
- fprintf(stderr, "copy_gen: ptr %p, ", Gmc_PMC_hdr_get_PMC(ptr));
- fprintf(stderr, "old_body: %p, ", PMC_body(Gmc_PMC_hdr_get_PMC(ptr)));
- fprintf(stderr, "new body: %p, ", Gmc_PMC_hdr_get_BODY(ptr));
- fprintf(stderr, "int_val: %ld\n",
PMC_int_val(Gmc_PMC_hdr_get_PMC(ptr)));
-#endif
- Gmc_PMC_hdr_set_GEN(ptr, dest);
- PMC_body(Gmc_PMC_hdr_get_PMC(ptr)) = Gmc_PMC_hdr_get_BODY(ptr);
- ptr = gc_gmc_next_hdr(ptr);
+ fprintf(stderr, "copy_gen: ptr %p, ", Gmc_OBJ_get_POBJ(obj));
+ fprintf(stderr, "old_body: %p, ",
Gmc_POBJ_get_BODY(Gmc_OBJ_get_POBJ(obj),PMC_BODY*));
+ fprintf(stderr, "new body: %p, ", Gmc_OBJ_get_BODY(obj,PMC_BODY*));
+ fprintf(stderr, "int_val: %ld\n", PMC_int_val(Gmc_OBJ_get_POBJ(obj)));
+#endif
+ Gmc_OBJ_set_GEN(obj, dest);
+ Gmc_POBJ_get_OBJ(Gmc_OBJ_get_POBJ(obj)) = obj;
+ obj = gc_gmc_next_obj(obj);
}
}
@@ -953,7 +954,7 @@ An IGP is being created, record it.
/* Add a header to a header list. */
static void
-gc_gmc_store_hdr_list(Interp *interpreter, Gc_gmc_hdr_list *l, Gc_gmc_hdr *h)
+gc_gmc_store_hdr_list(Interp *interpreter, Gc_gmc_hdr_list *l, PMC *o)
{
Gc_gmc_hdr_store *s = l->last;
@@ -972,10 +973,7 @@ gc_gmc_store_hdr_list(Interp *interprete
}
l->last = s;
}
- *(s->ptr)++ = Gmc_PMC_hdr_get_PMC(h);
-#ifdef GMC_DEBUG
- fprintf(stderr, "Adding IGP %p to store %p\n", Gmc_PMC_hdr_get_BODY(h), s);
-#endif
+ *(s->ptr)++ = o;
}
@@ -999,14 +997,14 @@ gc_gmc_find_igp(Gc_gmc_hdr_list *list, P
/* Removes a header from the IGP list. Raises an exception if the header was
not
* in the list.*/
static void
-gc_gmc_sweep_from_hdr_list(Interp *interpreter, Gc_gmc_hdr *h)
+gc_gmc_sweep_from_hdr_list(Interp *interpreter, Gc_gmc_obj *o)
{
Gc_gmc_gen *gen;
Gc_gmc_hdr_list *list;
Gc_gmc_hdr_store *store;
INTVAL i;
- gen = Gmc_PMC_hdr_get_GEN(h);
+ gen = Gmc_OBJ_get_GEN(o);
list = gen->IGP;
for (store = list->first; store; store = store->next)
{
@@ -1016,9 +1014,9 @@ gc_gmc_sweep_from_hdr_list(Interp *inter
for (i = 0; &store->store[i] < store->ptr; i++)
{
#ifdef GMC_DEBUG
- fprintf (stderr, "looking for %p, got %p\n", h, store->store[i]);
+ fprintf (stderr, "looking for %p, got %p\n", o, store->store[i]);
#endif
- if (Gmc_PMC_get_HDR(store->store[i]) == h)
+ if (Gmc_POBJ_get_OBJ(store->store[i]) == o)
{
for (i++; &store->store[i] < store->ptr; i++)
{
@@ -1029,7 +1027,7 @@ gc_gmc_sweep_from_hdr_list(Interp *inter
}
}
}
- fprintf (stderr, "bad igp: %p -> %p %p\n", Gmc_PMC_hdr_get_PMC(h), h,
Gmc_PMC_hdr_get_BODY(h));
+ fprintf (stderr, "bad igp: %p -> %p %p\n", Gmc_OBJ_get_POBJ(o), o,
Gmc_OBJ_get_BODY(o,PMC_BODY*));
internal_exception(1, "IGP pointer not found for removal!\n");
}
@@ -1038,9 +1036,9 @@ gc_gmc_sweep_from_hdr_list(Interp *inter
void gc_gmc_wb(Interp *interpreter, PMC *agg, void *old, void *new)
{
Gc_gmc_gen *gen;
- gen = Gmc_PMC_get_GEN((PMC*)agg);
+ gen = Gmc_POBJ_get_GEN((PMC*)agg);
if (!PObj_igp_TEST(agg))
- gc_gmc_store_hdr_list(interpreter, gen->IGP, Gmc_PMC_get_HDR(agg));
+ gc_gmc_store_hdr_list(interpreter, gen->IGP, agg);
PObj_igp_SET(agg);
}
@@ -1143,7 +1141,9 @@ gc_gmc_run(Interp *interpreter, int flag
return;
} else {
#ifdef GMC_NO_GC_RUN
+#ifdef GMC_DEBUG
fprintf(stderr, "Skipping GC run\n");
+#endif /* GMC_DEBUG */
#else
#ifdef GMC_DEBUG
fprintf(stderr, "GMC RUN !\n");
@@ -1171,7 +1171,7 @@ static int sweep_pmc (Interp *interprete
int flag, void *arg)
{
- Gc_gmc_hdr *hdr;
+ Gc_gmc_obj *obj;
Gc_gmc_gen *gen;
INTVAL pass = 0;
PMC *pmc, *old_pmc;
@@ -1185,9 +1185,9 @@ static int sweep_pmc (Interp *interprete
pass++;
gen = pool->gc->yng_fst;
}
- for (hdr = gen->fst_free; (UINTVAL)hdr < (UINTVAL)gen->first; hdr =
gc_gmc_next_hdr(hdr))
+ for (obj = gen->fst_free; (UINTVAL)obj < (UINTVAL)gen->first; obj =
gc_gmc_next_obj(obj))
{
- pmc = Gmc_PMC_hdr_get_PMC(hdr);
+ pmc = Gmc_OBJ_get_POBJ(obj);
/* We can do it only now, or we don't know how to go to the next
* body. */
if (old_pmc)
@@ -1202,7 +1202,7 @@ static int sweep_pmc (Interp *interprete
if (!PObj_live_TEST(pmc))
{
#ifdef BIG_DUMP
- fprintf(stderr, "sweep_pmc: %p -> (%p, %p)\n", pmc, hdr,
Gmc_PMC_hdr_get_BODY(hdr));
+ fprintf(stderr, "sweep_pmc: %p -> (%p, %p)\n", pmc, obj,
Gmc_OBJ_get_BODY(obj,PMC_BODY*));
#endif
if (PObj_needs_early_DOD_TEST(pmc))
--interpreter->arena_base->num_early_DOD_PMCs;
@@ -1211,11 +1211,11 @@ static int sweep_pmc (Interp *interprete
}
if (PObj_igp_TEST(pmc))
{
- gc_gmc_sweep_from_hdr_list(interpreter, hdr);
+ gc_gmc_sweep_from_hdr_list(interpreter, obj);
}
old_pmc = pmc;
sweep++;
- (Gmc_PMC_hdr_get_GEN(hdr))->alloc_obj--;
+ (Gmc_OBJ_get_GEN(obj))->alloc_obj--;
}
}
}
@@ -1235,12 +1235,12 @@ static int sweep_pmc (Interp *interprete
static int sweep_buf (Interp *interpreter, struct Small_Object_Pool *pool,
int flag, void *arg)
{
- Gc_gmc_hdr *hdr;
+ Gc_gmc_obj *obj;
Gc_gmc_gen *gen;
INTVAL pass = 0;
- PObj *obj, *old_obj;
+ PObj *pobj, *old_pobj;
- old_obj = NULL;
+ old_pobj = NULL;
for (gen = pool->gc->old_fst; gen || !pass; gen = gen->next)
{
@@ -1249,44 +1249,44 @@ static int sweep_buf (Interp *interprete
pass++;
gen = pool->gc->yng_fst;
}
- for (hdr = gen->fst_free; (UINTVAL)hdr < (UINTVAL)gen->first; hdr =
gc_gmc_next_hdr(hdr))
+ for (obj = gen->fst_free; (UINTVAL)obj < (UINTVAL)gen->first; obj =
gc_gmc_next_obj(obj))
{
- obj = (PObj*)Gmc_PMC_hdr_get_PMC(hdr);
- if (old_obj)
+ pobj = (PObj*)Gmc_OBJ_get_POBJ(obj);
+ if (old_pobj)
{
#ifdef BIG_DUMP
fprintf(stderr, "From sweep buf\n");
#endif
- (*pool->add_free_object)(interpreter, pool, old_obj);
+ (*pool->add_free_object)(interpreter, pool, old_pobj);
}
- old_obj = NULL;
+ old_pobj = NULL;
/* Go through all the headers of the pool. */
- if (!PObj_live_TEST(obj))
+ if (!PObj_live_TEST(pobj))
{
- if (PObj_sysmem_TEST(obj) && PObj_bufstart(obj)) {
+ if (PObj_sysmem_TEST(pobj) && PObj_bufstart(pobj)) {
/* has sysmem allocated, e.g. string_pin */
- mem_sys_free(PObj_bufstart(obj));
- PObj_bufstart(obj) = NULL;
- PObj_buflen(obj) = 0;
+ mem_sys_free(PObj_bufstart(pobj));
+ PObj_bufstart(pobj) = NULL;
+ PObj_buflen(pobj) = 0;
} else {
/*
* XXX Jarkko did report that on irix pool->mem_pool
* was NULL, which really shouldn't happen
*/
if (pool->mem_pool) {
- if (!PObj_COW_TEST(obj)) {
+ if (!PObj_COW_TEST(pobj)) {
((struct Memory_Pool *)
pool->mem_pool)->guaranteed_reclaimable +=
- PObj_buflen(obj);
+ PObj_buflen(pobj);
}
((struct Memory_Pool *)
pool->mem_pool)->possibly_reclaimable +=
- PObj_buflen(obj);
+ PObj_buflen(pobj);
}
- PObj_buflen(obj) = 0;
+ PObj_buflen(pobj) = 0;
}
- old_obj = obj;
+ old_pobj = pobj;
}
}
}
@@ -1299,7 +1299,7 @@ static int sweep_buf (Interp *interprete
gc_gmc_clear_live(Interp *interpreter, struct Small_Object_Pool *pool,
int flags, void *arg)
{
- Gc_gmc_hdr *hdr;
+ Gc_gmc_obj *obj;
Gc_gmc_gen *gen;
INTVAL pass = 0;
@@ -1310,8 +1310,8 @@ gc_gmc_clear_live(Interp *interpreter, s
pass++;
gen = pool->gc->yng_fst;
}
- for (hdr = gen->fst_free; (UINTVAL)hdr < (UINTVAL)gen->first; hdr =
gc_gmc_next_hdr(hdr))
- PObj_live_CLEAR(Gmc_PMC_hdr_get_PMC(hdr));
+ for (obj = gen->fst_free; (UINTVAL)obj < (UINTVAL)gen->first; obj =
gc_gmc_next_obj(obj))
+ PObj_live_CLEAR(Gmc_OBJ_get_POBJ(obj));
}
return 0;
}
@@ -1322,7 +1322,7 @@ static void
gc_gmc_init_pool_for_ms(Interp *interpreter, struct Small_Object_Pool *pool)
{
Gc_gmc_gen *gen;
- Gc_gmc_hdr *hdr;
+ Gc_gmc_obj *obj;
int pass;
for (gen = pool->gc->old_fst, pass = 0; gen || !pass; gen = gen->next)
{
@@ -1337,15 +1337,15 @@ gc_gmc_init_pool_for_ms(Interp *interpre
* us to have to run two times the GC). */
if (interpreter->arena_base->lazy_dod)
{
- for (hdr = gen->fst_free; (UINTVAL)hdr < (UINTVAL)gen->first; hdr =
gc_gmc_next_hdr(hdr))
- PObj_live_CLEAR(hdr);
+ for (obj = gen->fst_free; (UINTVAL)obj < (UINTVAL)gen->first; obj =
gc_gmc_next_obj(obj))
+ PObj_live_CLEAR(Gmc_OBJ_get_POBJ(obj));
}
}
}
/* Marks the contents of the root set as alive. */
-static int
+ static int
gc_gmc_trace_root(Interp *interpreter, int trace_stack)
{
return Parrot_dod_trace_root (interpreter, trace_stack);
@@ -1353,16 +1353,16 @@ gc_gmc_trace_root(Interp *interpreter, i
/* If the object is alive and has pointers to older PMC, mark them alive. */
-static void
-gc_gmc_trace_children(Interp *interpreter, Gc_gmc_hdr *h)
+ static void
+gc_gmc_trace_children(Interp *interpreter, Gc_gmc_obj *o)
{
UINTVAL mask = PObj_data_is_PMC_array_FLAG | PObj_custom_mark_FLAG;
UINTVAL bits;
PMC *pmc;
INTVAL i;
- pmc = Gmc_PMC_hdr_get_PMC(h);
- Gmc_PMC_hdr_get_GEN(h)->pool->gc->hdr_ref = h;
+ pmc = Gmc_OBJ_get_POBJ(o);
+ Gmc_OBJ_get_GEN(o)->pool->gc->hdr_ref = o;
bits = PObj_get_FLAGS(pmc) & mask;
if (bits)
@@ -1385,7 +1385,7 @@ gc_gmc_trace_children(Interp *interprete
}
static void
-gc_gmc_trace_igp_sons(Interp *interpreter, Gc_gmc_hdr *h)
+gc_gmc_trace_igp_sons(Interp *interpreter, Gc_gmc_obj *o)
{
UINTVAL mask = PObj_data_is_PMC_array_FLAG | PObj_custom_mark_FLAG;
UINTVAL bits;
@@ -1394,11 +1394,11 @@ gc_gmc_trace_igp_sons(Interp *interprete
INTVAL sav_state;
struct Small_Object_Pool *pool;
- pmc = Gmc_PMC_hdr_get_PMC(h);
+ pmc = Gmc_OBJ_get_POBJ(o);
- pool = Gmc_PMC_hdr_get_GEN(h)->pool;
+ pool = Gmc_OBJ_get_GEN(o)->pool;
sav_state = pool->gc->state;
- pool->gc->state = GMC_SON_OF_IGP_STATE;
+ pool->gc->state = GMC_SON_OF_IGP_STATE;
bits = PObj_get_FLAGS(pmc) & mask;
if (bits)
@@ -1432,7 +1432,7 @@ gc_gmc_trace_igp(Interp *interpreter, Gc
{
for (i = 0; &s->store[i] < s->ptr; i++)
{
- gc_gmc_trace_igp_sons(interpreter, Gmc_PMC_get_HDR(s->store[i]));
+ gc_gmc_trace_igp_sons(interpreter, Gmc_POBJ_get_OBJ(s->store[i]));
}
}
}
@@ -1444,22 +1444,22 @@ void
parrot_gc_gmc_pobject_lives(Interp *interpreter, PObj *o)
{
Gc_gmc *gc;
- Gc_gmc_hdr *h;
+ Gc_gmc_obj *obj;
- h = Gmc_PMC_get_HDR(o);
+ obj = Gmc_POBJ_get_OBJ(o);
#ifdef GMC_DEBUG
- fprintf (stderr, "PObject %p, body at %p lives !\n", o, h);
+ fprintf (stderr, "PObject %p, body at %p lives !\n", o, obj);
#endif
- gc = Gmc_PMC_body_get_GEN(PMC_body(o))->pool->gc;
+ gc = Gmc_OBJ_get_GEN(obj)->pool->gc;
switch (gc->state)
{
/* This object was precedently dead and has been marked alive as a
* consequence of IGP. */
case GMC_SON_OF_IGP_STATE:
- if (!PObj_live_TEST(o) && Gmc_PMC_get_GEN(o)->marked)
+ if (!PObj_live_TEST(o) && Gmc_OBJ_get_GEN(obj)->marked)
{
PObj_live_SET(o);
- gc_gmc_trace_igp_sons(interpreter, h);
+ gc_gmc_trace_igp_sons(interpreter, obj);
}
break;
case GMC_NORMAL_STATE:
@@ -1484,7 +1484,7 @@ static INTVAL
gc_gmc_mark(Interp *interpreter, struct Small_Object_Pool *pool, int flags)
{
INTVAL dopr = DEAD_OBJECTS_PER_RUN; /* Number of objects we want to find
in a run. */
- Gc_gmc_hdr *hdr, *h2;
+ Gc_gmc_obj *obj, *o2;
Gc_gmc_gen *gen;
INTVAL index;
INTVAL pass = 0;
@@ -1501,7 +1501,6 @@ gc_gmc_mark(Interp *interpreter, struct
gc_gmc_init_pool_for_ms(interpreter, pool);
gc_gmc_trace_root(interpreter, flags);
- hdr = pool->gc->gray;
gen = pool->gc->yng_lst;
pool->gc->hdr_ref = NULL;
pool->gc->state = GMC_NORMAL_STATE;
@@ -1524,9 +1523,9 @@ gc_gmc_mark(Interp *interpreter, struct
#endif
/* And go through it. */
- for (hdr = gen->fst_free; (UINTVAL)hdr < (UINTVAL)gen->first; hdr =
gc_gmc_next_hdr(hdr))
+ for (obj = gen->fst_free; (UINTVAL)obj < (UINTVAL)gen->first; obj =
gc_gmc_next_obj(obj))
{
- pool->gc->gray = hdr;
+ pool->gc->gray = obj;
/* If we have found enough objects, change our state and
* consider only IGP from now on. */
@@ -1536,11 +1535,11 @@ gc_gmc_mark(Interp *interpreter, struct
state = 1;
/* PObj is alive, trace its children */
- if (PObj_live_TEST((PObj*)Gmc_PMC_hdr_get_PMC(hdr)))
+ if (PObj_live_TEST(Gmc_OBJ_get_POBJ(obj)))
{
- if (PObj_igp_TEST(Gmc_PMC_hdr_get_PMC(hdr)))
- gc_gmc_trace_igp_sons(interpreter, hdr);
- gc_gmc_trace_children(interpreter, hdr);
+ if (PObj_igp_TEST(Gmc_OBJ_get_POBJ(obj)))
+ gc_gmc_trace_igp_sons(interpreter, obj);
+ gc_gmc_trace_children(interpreter, obj);
}
else
dopr--;
@@ -1560,24 +1559,21 @@ gc_gmc_mark(Interp *interpreter, struct
/* Copies a header and its pmc_body, then updates the pointers. */
/* We are sure that there is enough room in to. from and to may overlap. */
/* Also clear the live bit of the new object. */
-static Gc_gmc_hdr *
-gc_gmc_copy_hdr(Interp *interpreter, Gc_gmc_hdr *from, Gc_gmc_hdr *to)
+static Gc_gmc_obj *
+gc_gmc_copy_hdr(Interp *interpreter, Gc_gmc_obj *from, Gc_gmc_obj *to)
{
Gc_gmc_gen *gen;
size_t size;
- PObj_live_CLEAR(Gmc_PMC_hdr_get_PMC(to));
+ PObj_live_CLEAR(Gmc_OBJ_get_POBJ(to));
if (from == to)
- return gc_gmc_next_hdr(to);
+ return gc_gmc_next_obj(to);
size = gc_gmc_get_size(from);
- gen = Gmc_PMC_hdr_get_GEN(from);
+ gen = Gmc_OBJ_get_GEN(from);
memmove(to, from, size);
- Gmc_PMC_hdr_set_GEN(to, gen);
- PMC_body(Gmc_PMC_hdr_get_PMC(to)) = Gmc_PMC_hdr_get_BODY(to);
-#ifdef BIG_DUMP
- fprintf(stderr, "Copying header: %p -> (%p,%p) to (%p,%p), struct val :
%p\n", Gmc_PMC_hdr_get_PMC(from), from, Gmc_PMC_hdr_get_BODY(from), to,
Gmc_PMC_hdr_get_BODY(to), PMC_struct_val(Gmc_PMC_hdr_get_PMC(to)));
-#endif
- return gc_gmc_next_hdr(to);
+ Gmc_OBJ_set_GEN(to, gen);
+ Gmc_POBJ_get_OBJ(Gmc_OBJ_get_POBJ(to)) = to;
+ return gc_gmc_next_obj(to);
}
@@ -1631,8 +1627,8 @@ the area between fst_free and dest to fi
static INTVAL
gc_gmc_compact_gen(Interp *interpreter, Gc_gmc_gen *gen)
{
- Gc_gmc_hdr *orig;
- Gc_gmc_hdr *dest;
+ Gc_gmc_obj *orig;
+ Gc_gmc_obj *dest;
PMC *to_destroy;
size_t remaining;
size_t size;
@@ -1647,11 +1643,11 @@ gc_gmc_compact_gen(Interp *interpreter,
/* We are sure that orig will be the first to hit the barrier. */
while ((UINTVAL)orig < (UINTVAL)gen->first)
{
- assert(!((UINTVAL)orig % GMC_ALIGN));
+ /*assert(!((UINTVAL)orig % GMC_ALIGN));*/
/* Free any object that has the live flag clear. */
- while (((UINTVAL)orig < (UINTVAL)gen->first || !(leave = 1)) &&
!PObj_live_TEST(Gmc_PMC_hdr_get_PMC(orig)))
+ while (((UINTVAL)orig < (UINTVAL)gen->first || !(leave = 1)) &&
!PObj_live_TEST(Gmc_OBJ_get_POBJ(orig)))
{
- assert(!((UINTVAL)orig % GMC_ALIGN));
+ /*assert(!((UINTVAL)orig % GMC_ALIGN));*/
if (to_destroy)
{
#ifdef BIG_DUMP
@@ -1661,20 +1657,17 @@ gc_gmc_compact_gen(Interp *interpreter,
}
to_destroy = NULL;
- if (PObj_needs_early_DOD_TEST(Gmc_PMC_hdr_get_PMC(orig)))
+ if (PObj_needs_early_DOD_TEST(Gmc_OBJ_get_POBJ(orig)))
--interpreter->arena_base->num_early_DOD_PMCs;
- if (PObj_active_destroy_TEST(Gmc_PMC_hdr_get_PMC(orig)))
- VTABLE_destroy(interpreter, Gmc_PMC_hdr_get_PMC(orig));
- if (PObj_igp_TEST(Gmc_PMC_hdr_get_PMC(orig)))
+ if (PObj_active_destroy_TEST(Gmc_OBJ_get_POBJ(orig)))
+ VTABLE_destroy(interpreter, Gmc_OBJ_get_POBJ(orig));
+ if (PObj_igp_TEST(Gmc_OBJ_get_POBJ(orig)))
gc_gmc_sweep_from_hdr_list(interpreter, orig);
- to_destroy = Gmc_PMC_hdr_get_PMC(orig);
- orig = gc_gmc_next_hdr(orig);
+ to_destroy = Gmc_OBJ_get_POBJ(orig);
+ orig = gc_gmc_next_obj(orig);
gen->alloc_obj--;
destroyed++;
- assert(Gmc_PMC_hdr_get_PMC(orig));
-#ifdef BIG_DUMP
- fprintf(stderr, "%p -> %p, %p has been legally declared dead and
will be overwritten\n", Gmc_PMC_hdr_get_PMC(orig), orig,
Gmc_PMC_hdr_get_BODY(orig));
-#endif
+ assert(Gmc_OBJ_get_POBJ(orig));
}
if (!leave)
{
@@ -1690,7 +1683,7 @@ gc_gmc_compact_gen(Interp *interpreter,
size = gc_gmc_get_size(orig);
remaining -= size;
dest = gc_gmc_copy_hdr(interpreter, orig, dest);
- orig = (Gc_gmc_hdr*)((char*)orig + size);
+ orig = (Gc_gmc_obj*)((char*)orig + size);
}
}
@@ -1701,12 +1694,9 @@ gc_gmc_compact_gen(Interp *interpreter,
#endif
memmove((char*)gen->first - size, gen->fst_free, size);
gen->fst_free = (char*)gen->first - size;
- for (orig = gen->fst_free; (UINTVAL)orig < (UINTVAL)gen->first; orig =
gc_gmc_next_hdr(orig))
+ for (orig = gen->fst_free; (UINTVAL)orig < (UINTVAL)gen->first; orig =
gc_gmc_next_obj(orig))
{
-#ifdef BIG_DUMP
- fprintf(stderr, "copy_hdr: ptr %p, old_body %p, new_body %p, int val:
%ld\n", Gmc_PMC_hdr_get_PMC(orig), PMC_body(Gmc_PMC_hdr_get_PMC(orig)),
Gmc_PMC_hdr_get_BODY(orig), PMC_int_val(Gmc_PMC_hdr_get_PMC(orig)));
-#endif
- PMC_body(Gmc_PMC_hdr_get_PMC(orig)) = Gmc_PMC_hdr_get_BODY(orig);
+ Gmc_POBJ_get_OBJ(Gmc_OBJ_get_POBJ(orig)) = orig;
}
gen->remaining = remaining;
@@ -1723,7 +1713,7 @@ static void
gc_gmc_merge_gen(Interp *interpreter, Gc_gmc_gen *old, Gc_gmc_gen *yng)
{
size_t size;
- Gc_gmc_hdr *h;
+ Gc_gmc_obj *o;
struct Small_Object_Pool *pool;
Gc_gmc_hdr_store *store, *st2;
INTVAL i;
@@ -1737,26 +1727,24 @@ gc_gmc_merge_gen(Interp *interpreter, Gc
/* Copy the data. */
memcpy((char*)old->fst_free - size, yng->fst_free, size);
- h = (Gc_gmc_hdr*)((char*)old->fst_free - size);
+ o = (Gc_gmc_obj*)((char*)old->fst_free - size);
old->remaining -= size;
/* And update all pointers. */
- for (; (UINTVAL)h < (UINTVAL)old->fst_free; h = gc_gmc_next_hdr(h))
+ for (; (UINTVAL)o < (UINTVAL)old->fst_free; o = gc_gmc_next_obj(o))
{
-#ifdef BIG_DUMP
- fprintf(stderr, "merge_gen: h %p, ptr %p, old_body at %p, new body at
%p\n", h, Gmc_PMC_hdr_get_PMC(h), PMC_body(Gmc_PMC_hdr_get_PMC(h)),
Gmc_PMC_hdr_get_BODY(h));
-#endif
- Gmc_PMC_hdr_set_GEN(h,old);
- PMC_body(Gmc_PMC_hdr_get_PMC(h)) = Gmc_PMC_hdr_get_BODY(h);
+ Gmc_OBJ_set_GEN(o,old);
+ Gmc_POBJ_get_OBJ(Gmc_OBJ_get_POBJ(o)) = o;
}
old->fst_free = (void*)((char*)old->fst_free - size);
+ /* Merge IGP sets */
for (store = yng->IGP->first; store; store = store->next)
{
for (i = 0; &store->store[i] < store->ptr; i++)
{
if (!gc_gmc_find_igp(old->IGP, (PMC*)store->store[i]))
- gc_gmc_store_hdr_list(interpreter, old->IGP,
Gmc_PMC_get_HDR(store->store[i]));
+ gc_gmc_store_hdr_list(interpreter, old->IGP, store->store[i]);
}
}
@@ -1781,7 +1769,6 @@ gc_gmc_compact(Interp *interpreter, stru
Gc_gmc_gen *ogen;
INTVAL pass = 0;
INTVAL destroyed = 0;
- Gc_gmc_hdr *h;
gen = pool->gc->yng_lst;
ogen = NULL;
@@ -1806,6 +1793,14 @@ gc_gmc_compact(Interp *interpreter, stru
#ifdef GMC_DEBUG
fprintf(stderr, "Sweeped %ld objects\n", destroyed);
#endif
+#ifdef BIG_DUMP
+ void *ptr;
+ fprintf(stderr, "Dumping free_list\n");
+ for (ptr = pool->free_list; *(void**)ptr; ptr = *(void**)ptr)
+ fprintf(stderr, "%p -> ", ptr);
+ fprintf(stderr, "%p -> NULL\n", ptr);
+#endif
+
}
Modified: branches/gmc/src/jit_debug.c
==============================================================================
--- branches/gmc/src/jit_debug.c (original)
+++ branches/gmc/src/jit_debug.c Tue Sep 13 08:24:15 2005
@@ -187,11 +187,7 @@ write_types(FILE *stabs)
/* PMC type */
fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d", i, BYTE_SIZE(PMC));
fprintf(stabs, "obj:(0,%d),%d,%d;",
-#if PARROT_GC_GMC
- i + 1, BIT_OFFSET(PMC, body), BIT_SIZE(pobj_t));
-#else
i + 1, BIT_OFFSET(PMC, obj), BIT_SIZE(pobj_t));
-#endif
fprintf(stabs, "vtable:*(0,%d),%d,%d;",
i + 3, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*));
#if ! PMC_DATA_IN_EXT
Modified: branches/gmc/src/string.c
==============================================================================
--- branches/gmc/src/string.c (original)
+++ branches/gmc/src/string.c Tue Sep 13 08:24:15 2005
@@ -67,7 +67,7 @@ Parrot_unmake_COW(Interp *interpreter, S
if (PObj_is_cowed_TESTALL(s)) {
#if PARROT_GC_GMC
STRING for_alloc;
- PMC_body((PMC*)(&for_alloc)) =
mem_sys_allocate_zeroed(sizeof(pobj_body));
+ Gmc_POBJ_get_OBJ((PMC*)(&for_alloc)) =
mem_sys_allocate_zeroed(sizeof(pobj_body) + sizeof(Gc_gmc_obj));
#else
STRING for_alloc;
#endif
@@ -95,7 +95,7 @@ Parrot_unmake_COW(Interp *interpreter, S
/* COW_FLAG | external_FLAG | bufstart_external_FLAG immobile_FLAG */
PObj_is_external_CLEARALL(s);
#if PARROT_GC_GMC
- mem_sys_free(PMC_body((PMC*)(&for_alloc)));
+ mem_sys_free(Gmc_POBJ_get_OBJ((PMC*)(&for_alloc)));
#endif
}