perl.cvs.parrot
[Top] [All Lists]

[svn:parrot] r29896 - in branches/gsoc_pdd09: include/parrot src/gc

Subject: [svn:parrot] r29896 - in branches/gsoc_pdd09: include/parrot src/gc
From: Whiteknight@xxxxxxxxxxxx
Date: Wed, 30 Jul 2008 18:17:14 -0700 (PDT)
Newsgroups: perl.cvs.parrot

Author: Whiteknight
Date: Wed Jul 30 18:17:14 2008
New Revision: 29896

Modified:
   branches/gsoc_pdd09/include/parrot/smallobject.h
   branches/gsoc_pdd09/src/gc/gc_it.c

Log:
[gsoc_pdd09] a few more simplifications and fixes

Modified: branches/gsoc_pdd09/include/parrot/smallobject.h
==============================================================================
--- branches/gsoc_pdd09/include/parrot/smallobject.h    (original)
+++ branches/gsoc_pdd09/include/parrot/smallobject.h    Wed Jul 30 18:17:14 2008
@@ -17,12 +17,6 @@
 
 #define POOL_MAX_BYTES                         65536 * 128
 
-
-#if PARROT_GC_IT
-/* forward declarations */
-struct Gc_it_hdr;
-#endif
-
 typedef struct Small_Object_Arena {
     size_t                     used;
     size_t                     total_objects;
@@ -141,7 +135,7 @@
     struct {
         unsigned short flag;
         unsigned short agg;
-    } data;
+    }                           data;
 } Gc_it_hdr;
 
 #  define GC_IT_CARD_WHITE  0x00     /* Item is dead */

Modified: branches/gsoc_pdd09/src/gc/gc_it.c
==============================================================================
--- branches/gsoc_pdd09/src/gc/gc_it.c  (original)
+++ branches/gsoc_pdd09/src/gc/gc_it.c  Wed Jul 30 18:17:14 2008
@@ -562,7 +562,7 @@
 #    endif
 
     for (arena = pool->last_Arena; arena; arena = arena->prev) {
-        INTVAL     i     = arena->card_info._d.last_index;
+        INTVAL i         = arena->total_objects;
         Gc_it_hdr *hdr   = (Gc_it_hdr *)arena->start_objects;
         UINTVAL    mark;
 
@@ -621,65 +621,24 @@
 #    endif
 
     for (arena = pool->last_Arena; arena; arena = arena->prev) {
-        Gc_it_card * const card_start = arena->cards;
-        Gc_it_card * card             = (card_start + 
arena->card_info._d.card_size - 1);
-        UINTVAL i                     = arena->card_info._d.last_index;
+        INTVAL i                      = arena->total_objects;
         Gc_it_hdr *hdr                = (Gc_it_hdr *)arena->start_objects;
         UINTVAL mark;
 
-        PARROT_ASSERT(card);
-
         /* Partially unroll the loop with Duff's device: four items at a time.
            I can make some parts of this more efficient, but for now let's
            stick with the basics. */
-        switch (arena->card_info._d.last_index % 4) {
-            case 3:
-                do {
-                    mark = gc_it_get_card_mark_index(card, 3);
-                    if (mark == GC_IT_CARD_WHITE) {
-                        GC_IT_ADD_TO_FREE_LIST(pool, hdr);
-                        gc_it_set_card_mark_index(card, 3, GC_IT_CARD_FREE);
-                        ++pool->num_free_objects;
-                    }
-                    else if (mark == GC_IT_CARD_BLACK)
-                        gc_it_set_card_mark_index(card, 3, GC_IT_CARD_WHITE);
-                    hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
-                    i--;
-            case 2:
-                    mark = gc_it_get_card_mark_index(card, 2);
-                    if (mark == GC_IT_CARD_WHITE) {
-                        GC_IT_ADD_TO_FREE_LIST(pool, hdr);
-                        gc_it_set_card_mark_index(card, 2, GC_IT_CARD_FREE);
-                        ++pool->num_free_objects;
-                    }
-                    else if (mark == GC_IT_CARD_BLACK)
-                        gc_it_set_card_mark_index(card, 2, GC_IT_CARD_WHITE);
-                    hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
-                    i--;
-            case 1:
-                    mark = gc_it_get_card_mark_index(card, 1);
-                    if (mark == GC_IT_CARD_WHITE) {
-                        GC_IT_ADD_TO_FREE_LIST(pool, hdr);
-                        gc_it_set_card_mark_index(card, 1, GC_IT_CARD_FREE);
-                        ++pool->num_free_objects;
-                    }
-                    else if (mark == GC_IT_CARD_BLACK)
-                        gc_it_set_card_mark_index(card, 1, GC_IT_CARD_WHITE);
-                    hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
-                    i--;
-            case 0:
-            default:
-                    mark = gc_it_get_card_mark_index(card, 0);
-                    if (mark == GC_IT_CARD_WHITE) {
-                        GC_IT_ADD_TO_FREE_LIST(pool, hdr);
-                        gc_it_set_card_mark_index(card, 0, GC_IT_CARD_FREE);
-                        ++pool->num_free_objects;
-                    }
-                    else if (mark == GC_IT_CARD_BLACK)
-                        gc_it_set_card_mark_index(card, 0, GC_IT_CARD_WHITE);
-                    hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
-                    i--;
-                } while (card-- != arena->cards);
+        while (i >= 0) {
+            mark = gc_it_get_card_mark(hdr);
+            if (mark == GC_IT_CARD_WHITE) {
+                GC_IT_ADD_TO_FREE_LIST(pool, hdr);
+                gc_it_set_card_mark(hdr, GC_IT_CARD_FREE);
+                ++pool->num_free_objects;
+            }
+            else if (mark == GC_IT_CARD_BLACK)
+                gc_it_set_card_mark(hdr, GC_IT_CARD_WHITE);
+            hdr = (Gc_it_hdr*)((char*)hdr + (pool->object_size));
+            i--;
         }
     }
 }

<Prev in Thread] Current Thread [Next in Thread>
  • [svn:parrot] r29896 - in branches/gsoc_pdd09: include/parrot src/gc, Whiteknight <=