# New Ticket Created by Leopold Toetsch
# Please include the string: [perl #19668]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=19668 >
Attached patch changes a view places, which cause problems running w/o
trace_system_areas().
With this all parrot tests pass here (i386/linux) with or without
--gc-debug. Some perl6 tests related to try/catch are failing.
Please check this on different platforms, TIA.
leo
-- attachment 1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/46715/36710/7ee026/infant-mort-1.patch
--- parrot/classes/default.pmc Mon Dec 30 18:38:57 2002
+++ parrot-leo/classes/default.pmc Thu Jan 2 12:44:10 2003
@@ -65,7 +65,8 @@
SELF->metadata, p_key, value, NULL);
} else {
/* first make new hash */
- SELF->metadata = pmc_new(interpreter, enum_class_PerlHash);
+ SELF->metadata = pmc_new_noinit(interpreter, enum_class_PerlHash);
+ SELF->metadata->vtable->init(interpreter, SELF->metadata);
/* then the key, else it vanishes with --gc-debug */
p_key = key_new_string(interpreter, key);
SELF->metadata->vtable->set_pmc_keyed(interpreter,
--- parrot/dod.c Mon Dec 30 11:47:25 2002
+++ parrot-leo/dod.c Thu Jan 2 12:18:40 2003
@@ -22,8 +22,6 @@
#endif
static size_t find_common_mask(size_t val1, size_t val2);
-static void trace_system_stack(struct Parrot_Interp *);
-
void pobject_lives(struct Parrot_Interp *interpreter, PObj *obj)
{
@@ -93,7 +91,7 @@
#if ! DISABLE_GC_DEBUG
CONSERVATIVE_POINTER_CHASING = 1;
#endif
- trace_system_areas(interpreter);
+ /* trace_system_areas(interpreter); */
#if ! DISABLE_GC_DEBUG
CONSERVATIVE_POINTER_CHASING = 0;
#endif
--- parrot/hash.c Fri Dec 27 10:34:28 2002
+++ parrot-leo/hash.c Thu Jan 2 12:34:27 2003
@@ -418,6 +418,8 @@
hash_clone(struct Parrot_Interp *interp, HASH *hash, HASH **dest)
{
HashIndex i;
+
+ Parrot_block_DOD(interp);
new_hash(interp, dest);
for (i = 0; i <= hash->max_chain; i++) {
BucketIndex bi = lookupBucketIndex(hash, i);
@@ -456,6 +458,7 @@
bi = b->next;
}
}
+ Parrot_unblock_DOD(interp);
}
/*
--- parrot/resources.c Fri Dec 27 10:34:28 2002
+++ parrot-leo/resources.c Tue Dec 31 14:26:26 2002
@@ -45,6 +45,8 @@
new_block = mem_sys_allocate_zeroed(sizeof(struct Memory_Block) +
alloc_size + 32);
if (!new_block) {
+ fprintf(stderr, "out of mem allocsize = %d\n", (int)alloc_size+32);
+ exit(1);
return NULL;
}
@@ -110,25 +112,25 @@
}
}
if (pool->top_block->free < size) {
+ Parrot_do_dod_run(interpreter);
/* Compact the pool if allowed and worthwhile */
if (pool->compact) {
/* don't bother reclaiming if its just chicken feed */
- if ((pool->possibly_reclaimable + pool->guaranteed_reclaimable) / 2
- > (size_t)(pool->total_allocated * pool->reclaim_factor)
+ if (pool->possibly_reclaimable * pool->reclaim_factor
+ > size
/* don't bother reclaiming if it won't even be enough */
- && (pool->guaranteed_reclaimable > size)
+ || (pool->guaranteed_reclaimable > size)
) {
(*pool->compact) (interpreter, pool);
}
- else {
- Parrot_do_dod_run(interpreter);
- }
}
if (pool->top_block->free < size) {
alloc_new_block(interpreter, size, pool);
interpreter->mem_allocs_since_last_collect++;
if (pool->top_block->free < size) {
+ fprintf(stderr, "out of mem\n");
+ exit(1);
return NULL;
}
}
--- parrot/spf_render.c Tue Dec 17 08:30:55 2002
+++ parrot-leo/spf_render.c Thu Jan 2 12:28:59 2003
@@ -228,6 +228,7 @@
char tc[PARROT_SPRINTF_BUFFER_SIZE];
+ Parrot_block_DOD(interpreter);
for (i = old = len = 0; i < (INTVAL) string_length(pat); i++) {
if (string_ord(pat, i) == '%') { /* % */
if (len) {
@@ -663,6 +664,7 @@
string_append(interpreter, targ, substr, 0);
}
+ Parrot_unblock_DOD(interpreter);
return targ;
}
--- parrot/string.c Thu Dec 26 12:32:35 2002
+++ parrot-leo/string.c Thu Jan 2 12:41:12 2003
@@ -244,7 +244,12 @@
PObj_bufstart_external_SET(s);
}
else {
+ /* allocate_string can trigger DOD, which destroys above allocated
+ * string header w/o stack_walk
+ */
+ Parrot_block_DOD(interpreter);
Parrot_allocate_string(interpreter, s, len);
+ Parrot_unblock_DOD(interpreter);
}
s->encoding = encoding;
s->type = type;