[svn:parrot] r47359 - branches/gc_massacre/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Sat Jun 5 00:11:11 UTC 2010


Author: bacek
Date: Sat Jun  5 00:11:11 2010
New Revision: 47359
URL: https://trac.parrot.org/parrot/changeset/47359

Log:
Start allocating string headers from PoolAllocator.

Modified:
   branches/gc_massacre/src/gc/gc_ms2.c

Modified: branches/gc_massacre/src/gc/gc_ms2.c
==============================================================================
--- branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:10:54 2010	(r47358)
+++ branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:11:11 2010	(r47359)
@@ -24,9 +24,12 @@
 typedef struct MarkSweep_GC {
     /* Allocator for PMC headers */
     struct Pool_Allocator *pmc_allocator;
-
     struct Linked_List    *objects;
 
+    /* Allocator for strings */
+    struct Pool_Allocator *string_allocator;
+    struct Linked_List    *strings;
+
     /** statistics for GC **/
     size_t  gc_mark_runs;       /* Number of times we've done a mark run */
     size_t  gc_lazy_mark_runs;  /* Number of successful lazy mark runs */
@@ -91,8 +94,9 @@
 
 PARROT_MALLOC
 PARROT_CAN_RETURN_NULL
-static STRING* gc_ms2_allocate_string_header(SHIM_INTERP,
-    SHIM(UINTVAL flags));
+static STRING* gc_ms2_allocate_string_header(PARROT_INTERP,
+    SHIM(UINTVAL flags))
+        __attribute__nonnull__(1);
 
 static void gc_ms2_allocate_string_storage(SHIM_INTERP,
     ARGMOD(STRING *str),
@@ -125,7 +129,9 @@
 static void gc_ms2_free_pmc_header(PARROT_INTERP, ARGFREE(PMC *pmc))
         __attribute__nonnull__(1);
 
-static void gc_ms2_free_string_header(SHIM_INTERP, ARGFREE(STRING *s));
+static void gc_ms2_free_string_header(PARROT_INTERP, ARGFREE(STRING *s))
+        __attribute__nonnull__(1);
+
 static size_t gc_ms2_get_gc_info(SHIM_INTERP, SHIM(Interpinfo_enum what));
 static unsigned int gc_ms2_is_blocked_GC_mark(PARROT_INTERP)
         __attribute__nonnull__(1);
@@ -193,7 +199,8 @@
        PARROT_ASSERT_ARG(pmc))
 #define ASSERT_ARGS_gc_ms2_allocate_pmc_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_gc_ms2_allocate_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
+#define ASSERT_ARGS_gc_ms2_allocate_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_gc_ms2_allocate_string_storage \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(str))
@@ -211,7 +218,8 @@
        PARROT_ASSERT_ARG(pmc))
 #define ASSERT_ARGS_gc_ms2_free_pmc_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_gc_ms2_free_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
+#define ASSERT_ARGS_gc_ms2_free_string_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_gc_ms2_get_gc_info __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
 #define ASSERT_ARGS_gc_ms2_is_blocked_GC_mark __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
@@ -326,23 +334,6 @@
 
 PARROT_MALLOC
 PARROT_CAN_RETURN_NULL
-static STRING*
-gc_ms2_allocate_string_header(SHIM_INTERP, SHIM(UINTVAL flags))
-{
-    ASSERT_ARGS(gc_ms2_allocate_string_header)
-    return (STRING*)calloc(sizeof (STRING), 1);
-}
-
-static void
-gc_ms2_free_string_header(SHIM_INTERP, ARGFREE(STRING *s))
-{
-    ASSERT_ARGS(gc_ms2_free_string_header)
-    if (s)
-        free(s);
-}
-
-PARROT_MALLOC
-PARROT_CAN_RETURN_NULL
 static Buffer*
 gc_ms2_allocate_bufferlike_header(SHIM_INTERP, SHIM(size_t size))
 {
@@ -554,9 +545,12 @@
 
         self->pmc_allocator = Parrot_gc_create_pool_allocator(
             sizeof (List_Item_Header) + sizeof (PMC));
-
         self->objects = Parrot_gc_allocate_linked_list(interp);
 
+        self->string_allocator = Parrot_gc_create_pool_allocator(
+            sizeof (List_Item_Header) + sizeof (STRING));
+        self->strings = Parrot_gc_allocate_linked_list(interp);
+
     }
     interp->gc_sys->gc_private = self;
 }
@@ -582,11 +576,6 @@
 
     ret = LLH2Obj_typed(ptr, PMC);
 
-    /* Quick hack to register "constant" pmcs */
-    if (flags & PObj_constant_FLAG) {
-        //Parrot_pmc_gc_register(interp, ret);
-    }
-
     return ret;
 }
 
@@ -604,6 +593,39 @@
     }
 }
 
+PARROT_MALLOC
+PARROT_CAN_RETURN_NULL
+static STRING*
+gc_ms2_allocate_string_header(PARROT_INTERP, SHIM(UINTVAL flags))
+{
+    ASSERT_ARGS(gc_ms2_allocate_string_header)
+    MarkSweep_GC     *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    List_Item_Header *ptr;
+    STRING           *ret;
+
+    ptr = (List_Item_Header *)Parrot_gc_pool_allocate(interp,
+        self->string_allocator);
+    LIST_APPEND(self->strings, ptr);
+
+    ret = LLH2Obj_typed(ptr, STRING);
+    memset(ret, 0, sizeof (STRING));
+    return ret;
+}
+
+static void
+gc_ms2_free_string_header(PARROT_INTERP, ARGFREE(STRING *s))
+{
+    ASSERT_ARGS(gc_ms2_free_string_header)
+    MarkSweep_GC *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    if (s) {
+        if (PObj_on_free_list_TEST(s))
+            return;
+        Parrot_gc_list_remove(interp, self->strings, Obj2LLH(s));
+        PObj_on_free_list_SET(s);
+        Parrot_gc_pool_free(self->string_allocator, Obj2LLH(s));
+    }
+}
+
 static void
 gc_ms2_mark_and_sweep(PARROT_INTERP, UINTVAL flags)
 {


More information about the parrot-commits mailing list