Since I am unable to help with the C part of things, I
figured I could at least track
down where the problem was for everyone. I have
isolated the ARENA_DOD_FLAGS problem
on Cygwin to a change committed to CVS between
2004-04-15 10:00 and 10:15 EDT. After
10:15, I need to disable it for it to compile.
There are 5 files that changed in that interval
headers.c
objects.c
pmc.c
smallobject.c
sub.c
here are the diffs
$ diff -u /tmp/good/sub.c /tmp/bad/sub.c
--- /tmp/good/sub.c 2004-05-06 12:08:49.638886800
-0400
+++ /tmp/bad/sub.c 2004-05-06 12:08:11.006060400
-0400
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights
Reserved.
-$Id: sub.c,v 1.59 2004/04/14 15:23:01 leo Exp $
+$Id: sub.c,v 1.60 2004/04/15 14:01:04 leo Exp $
=head1 NAME
@@ -446,8 +446,10 @@
/* fprintf(stderr, "** add %p free = %p\n", sub,
mc->retc_free_list); */
PMC_struct_val(sub) = mc->retc_free_list;
mc->retc_free_list = sub;
- /* don't mark the continuation context */
- PObj_custom_mark_CLEAR(sub);
+ /* don't mark the continuation context
+ * -- don't use PObj_custom_mark_* - too
expensive and not necessary
+ */
+ PObj_flag_CLEAR(custom_mark, sub);
/*
* shouldn't be necessary, s. also stack_common.c
*/
@@ -465,7 +467,7 @@
return NULL;
retc = mc->retc_free_list;
mc->retc_free_list = PMC_struct_val(retc);
- PObj_custom_mark_SET(retc);
+ PObj_flag_SET(custom_mark, retc);
/* PObj_on_free_list_CLEAR(retc); */
/* fprintf(stderr, "** get %p free = %p\n", retc,
mc->retc_free_list ); */
return retc;
$ diff -u /tmp/good/smallobject.c
/tmp/bad/smallobject.c
--- /tmp/good/smallobject.c 2004-05-06
12:08:44.222197200 -0400
+++ /tmp/bad/smallobject.c 2004-05-06
12:08:00.032594400 -0400
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights
Reserved.
-$Id: smallobject.c,v 1.41 2004/04/15 07:32:09 leo Exp
$
+$Id: smallobject.c,v 1.42 2004/04/15 14:01:04 leo Exp
$
=head1 NAME
@@ -198,10 +198,6 @@
pool->free_list = *(void **)ptr;
*((Dead_PObj*)ptr)->arena_dod_flag_ptr &=
~ (PObj_on_free_list_FLAG <<
((Dead_PObj*)ptr)->flag_shift);
-#if ! DISABLE_GC_DEBUG
- if (GC_DEBUG(interpreter))
- PObj_version((Buffer*)ptr) =
interpreter->dod_runs;
-#endif
return ptr;
}
$ diff -u /tmp/good/pmc.c /tmp/bad/pmc.c | more
--- /tmp/good/pmc.c 2004-05-06 12:08:37.793769600
-0400
+++ /tmp/bad/pmc.c 2004-05-06 12:07:45.121132800
-0400
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights
Reserved.
-$Id: pmc.c,v 1.77 2004/04/15 07:32:09 leo Exp $
+$Id: pmc.c,v 1.78 2004/04/15 14:01:04 leo Exp $
=head1 NAME
@@ -17,7 +17,7 @@
*/
#include "parrot/parrot.h"
-static PMC* get_new_pmc_header(Parrot_Interp, INTVAL
base_type, int constant);
+static PMC* get_new_pmc_header(Parrot_Interp, INTVAL
base_type, UINTVAL flags);
#if PARROT_CATCH_NULL
@@ -40,8 +40,8 @@
{
LOCK(init_null_mutex);
if(!PMCNULL)
- PMCNULL = get_new_pmc_header(interpreter,
enum_class_Null, 1);
- PMCNULL->pmc_ext = NULL;
+ PMCNULL = get_new_pmc_header(interpreter,
enum_class_Null,
+ PObj_constant_FLAG);
PMCNULL->vtable =
Parrot_base_vtables[enum_class_Null];
UNLOCK(init_null_mutex);
return PMCNULL;
@@ -75,7 +75,7 @@
=item C<static PMC*
get_new_pmc_header(struct Parrot_Interp *interpreter,
INTVAL base_type,
- int constant)>
+ UINTVAL flags)>
Gets a new PMC header.
@@ -85,35 +85,42 @@
static PMC*
get_new_pmc_header(struct Parrot_Interp *interpreter,
INTVAL base_type,
- int constant)
+ UINTVAL flags)
{
PMC *pmc;
+ VTABLE *vtable = Parrot_base_vtables[base_type];
- if (Parrot_base_vtables[base_type]->flags &
VTABLE_IS_CONST_FLAG) {
+ if (vtable->flags & VTABLE_IS_CONST_FLAG) {
/* put the normal vtable in, so that the pmc
can be initialized first
* parrot or user code has to set the _ro
property then,
* to morph the PMC to the const variant
+ * This assumes that a constant PMC enum is
one bigger then
+ * the normal one.
*/
- constant = 1;
+ flags = PObj_constant_FLAG;
--base_type;
+ vtable = Parrot_base_vtables[base_type];
+ }
+ if (vtable->flags & VTABLE_PMC_NEEDS_EXT) {
+ flags |= PObj_is_PMC_EXT_FLAG;
+ if (vtable->flags & VTABLE_IS_SHARED_FLAG)
+ flags |= PObj_is_PMC_shared_FLAG;
}
- pmc = new_pmc_header(interpreter, constant);
+ pmc = new_pmc_header(interpreter, flags);
if (!pmc) {
internal_exception(ALLOCATION_ERROR,
"Parrot VM: PMC allocation
failed!\n");
return NULL;
}
- if (constant)
- PObj_constant_SET(pmc);
- pmc->vtable = Parrot_base_vtables[base_type];
+ pmc->vtable = vtable;
- if (!pmc->vtable || !pmc->vtable->init) {
+ if (!vtable || !vtable->init) {
/* This is usually because you either didn't
call init_world early
* enough or you added a new PMC class
without adding
* Parrot_(classname)_class_init to
init_world. */
- PANIC("Null vtable used");
+ PANIC("Null vtable used or missing init");
return NULL;
}
#if GC_VERBOSE
@@ -125,32 +132,6 @@
return pmc;
}
-/*
-
-=item C<static void
-pmc_new_ext(Parrot_Interp interpreter, PMC *pmc,
INTVAL base_type)>
-
-Add a new C<PMC_EXT> to C<*pmc>. If the C<*pmc> is
shared also add
-the C<synchronize> structure and init the mutex.
-
-=cut
-
-*/
-
-static void
-pmc_new_ext(Parrot_Interp interpreter, PMC *pmc,
INTVAL base_type)
-{
- if (pmc->vtable->flags & VTABLE_PMC_NEEDS_EXT) {
- add_pmc_ext(interpreter, pmc);
-
- if (pmc->vtable->flags &
VTABLE_IS_SHARED_FLAG) {
- PMC_sync(pmc) =
mem_sys_allocate(sizeof(*PMC_sync(pmc)));
- PMC_sync(pmc)->owner = interpreter;
- MUTEX_INIT(PMC_sync(pmc)->pmc_lock);
- PObj_is_PMC_shared_SET(pmc);
- }
- }
-}
/*
@@ -179,7 +160,8 @@
pmc =
VTABLE_get_pmc_keyed_int(interpreter,
interpreter->iglobals,
(INTVAL)IGLOBALS_ENV_HASH);
if (!pmc) {
- pmc = get_new_pmc_header(interpreter,
base_type, 1);
+ pmc = get_new_pmc_header(interpreter,
base_type,
+ PObj_constant_FLAG);
VTABLE_set_pmc_keyed_int(interpreter,
interpreter->iglobals,
(INTVAL)IGLOBALS_ENV_HASH,
pmc);
/* UNLOCK */}
@@ -196,13 +178,13 @@
pmc =
(Parrot_base_vtables[base_type]->get_pointer)(interpreter,
NULL);
/* LOCK */
if (!pmc) {
- pmc = get_new_pmc_header(interpreter,
base_type, 1);
+ pmc = get_new_pmc_header(interpreter,
base_type,
+ PObj_constant_FLAG);
VTABLE_set_pointer(interpreter, pmc,
pmc);
}
return pmc;
}
pmc = get_new_pmc_header(interpreter, base_type,
0);
- pmc_new_ext(interpreter, pmc, base_type);
return pmc;
}
@@ -220,8 +202,8 @@
PMC *
constant_pmc_new_noinit(struct Parrot_Interp
*interpreter, INTVAL base_type)
{
- PMC *pmc = get_new_pmc_header(interpreter,
base_type, 1);
- pmc_new_ext(interpreter, pmc, base_type);
+ PMC *pmc = get_new_pmc_header(interpreter,
base_type,
+ PObj_constant_FLAG);
return pmc;
}
@@ -239,8 +221,8 @@
PMC *
constant_pmc_new(struct Parrot_Interp *interpreter,
INTVAL base_type)
{
- PMC *pmc = get_new_pmc_header(interpreter,
base_type, 1);
- pmc_new_ext(interpreter, pmc, base_type);
+ PMC *pmc = get_new_pmc_header(interpreter,
base_type,
+ PObj_constant_FLAG);
VTABLE_init(interpreter, pmc);
return pmc;
}
@@ -283,7 +265,6 @@
PMC *init)
{
PMC *pmc = get_new_pmc_header(interpreter,
base_type, 1);
- pmc_new_ext(interpreter, pmc, base_type);
VTABLE_init_pmc(interpreter, pmc, init);
return pmc;
}
$ diff -u /tmp/good/objects.c /tmp/bad/objects.c
--- /tmp/good/objects.c 2004-05-06 12:08:32.859601200
-0400
+++ /tmp/bad/objects.c 2004-05-06 12:07:37.245141600
-0400
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights
Reserved.
-$Id: objects.c,v 1.82 2004/04/14 14:30:49 leo Exp $
+$Id: objects.c,v 1.83 2004/04/15 14:01:04 leo Exp $
=head1 NAME
@@ -613,7 +613,7 @@
set_attrib_array_size(new_object_array,
attrib_count +
POD_FIRST_ATTRIB);
/* then activate marking it -
set_attrib_flags(object); */
- PObj_custom_mark_SET(object);
+ PObj_flag_SET(custom_mark, object);
/* 0 - class PMC, 1 - class name */
SET_CLASS(new_object_array, object, class);
set_attrib_num(new_object_array, POD_CLASS_NAME,
class_name);
$ diff -u /tmp/good/headers.c /tmp/bad/headers.c
--- /tmp/good/headers.c 2004-05-06 12:08:27.458476800
-0400
+++ /tmp/bad/headers.c 2004-05-06 12:07:27.298978800
-0400
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights
Reserved.
-$Id: headers.c,v 1.49 2004/04/15 10:51:12 leo Exp $
+$Id: headers.c,v 1.50 2004/04/15 14:01:04 leo Exp $
=head1 NAME
@@ -233,23 +233,40 @@
*/
+static PMC_EXT * new_pmc_ext(Parrot_Interp);
+
PMC *
new_pmc_header(struct Parrot_Interp *interpreter,
UINTVAL flags)
{
struct Small_Object_Pool *pool;
PMC *pmc;
- pool = flags ?
+ pool = flags & PObj_constant_FLAG ?
interpreter->arena_base->constant_pmc_pool :
interpreter->arena_base->pmc_pool;
pmc = pool->get_free_object(interpreter, pool);
/* clear flags, set is_PMC_FLAG */
- PObj_flags_SETTO(pmc, PObj_is_PMC_FLAG);
+ if (flags & PObj_is_PMC_EXT_FLAG) {
+#if ARENA_DOD_FLAGS
+ *((Dead_PObj*)pmc)->arena_dod_flag_ptr |=
+ (PObj_is_special_PMC_FLAG <<
((Dead_PObj*)pmc)->flag_shift);
+#else
+ PObj_is_special_PMC_SET(pmc);
+#endif
+ pmc->pmc_ext = new_pmc_ext(interpreter);
+ if (flags & PObj_is_PMC_shared_FLAG) {
+ PMC_sync(pmc) =
mem_sys_allocate(sizeof(*PMC_sync(pmc)));
+ PMC_sync(pmc)->owner = interpreter;
+ MUTEX_INIT(PMC_sync(pmc)->pmc_lock);
+ }
+ }
+ else
+ pmc->pmc_ext = NULL;
+ PObj_flags_SETTO(pmc, PObj_is_PMC_FLAG|flags);
pmc->vtable = NULL;
#if ! PMC_DATA_IN_EXT
PMC_data(pmc) = NULL;
#endif
- pmc->pmc_ext = NULL;
return pmc;
}
@@ -264,7 +281,7 @@
*/
-static PARROT_INLINE PMC_EXT *
+static PMC_EXT *
new_pmc_ext(struct Parrot_Interp *interpreter)
{
struct Small_Object_Pool *pool =
interpreter->arena_base->pmc_ext_pool;
Cheers
Joshua Gatcomb
a.k.a. Limbic~Region
__________________________________
Do you Yahoo!?
Win a $20,000 Career Makeover at Yahoo! HotJobs
http://hotjobs.sweepstakes.yahoo.com/careermakeover