Defer allocation as long as possible. Make logic parallel.
Index: stacks.c
===================================================================
RCS file: /home/perlcvs/parrot/stacks.c,v
retrieving revision 1.23
diff -u -r1.23 stacks.c
--- stacks.c 8 Mar 2002 03:04:03 -0000 1.23
+++ stacks.c 22 Mar 2002 06:45:39 -0000
@@ -108,7 +108,21 @@
void *thing, INTVAL type, stack_cleanup_method_t cleanup)
{
Stack_Chunk chunk = stack->prev;
- Stack_Entry entry = &chunk->entry[chunk->used];
+ Stack_Entry entry;
+
+ /* Do we need a new chunk? */
+ if (chunk->used == STACK_CHUNK_DEPTH) {
+ /* Need to add a new chunk */
+ Stack_Chunk new_chunk = mem_allocate_aligned(sizeof(*new_chunk));
+ new_chunk->used = 0;
+ new_chunk->next = stack;
+ new_chunk->prev = chunk;
+ chunk->next = new_chunk;
+ stack->prev = new_chunk;
+ chunk = new_chunk;
+ }
+
+ entry = &chunk->entry[chunk->used];
/* Remember the type */
entry->entry_type = type;
@@ -139,16 +153,7 @@
break;
}
- /* Register the new entry */
- if (++chunk->used == STACK_CHUNK_DEPTH) {
- /* Need to add a new chunk */
- Stack_Chunk new_chunk = mem_allocate_aligned(sizeof(*new_chunk));
- new_chunk->used = 0;
- new_chunk->next = stack;
- new_chunk->prev = chunk;
- chunk->next = new_chunk;
- stack->prev = new_chunk;
- }
+ chunk->used++;
}
/* Pop off an entry and return a pointer to the contents */
@@ -176,7 +181,10 @@
internal_exception(ERROR_STACK_EMPTY, "No entries on stack!\n");
}
- entry = &chunk->entry[chunk->used - 1];
+ /* Now decrement the SP */
+ chunk->used--;
+
+ entry = &chunk->entry[chunk->used];
/* Types of 0 mean we don't care */
if (type && entry->entry_type != type) {
@@ -189,8 +197,6 @@
(*entry->cleanup) (entry);
}
- /* Now decrement the SP */
- chunk->used--;
/* Sometimes the caller doesn't care what the value was */
if (where == NULL)
--
Bryan C. Warnock
[EMAIL PROTECTED]