[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