[pypy-commit] stmgc default: re-introduce objects_pointing_to_nursery
Raemi
noreply at buildbot.pypy.org
Wed Sep 3 11:29:05 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r1336:3efac6fcb465
Date: 2014-09-03 10:35 +0200
http://bitbucket.org/pypy/stmgc/changeset/3efac6fcb465/
Log: re-introduce objects_pointing_to_nursery
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -5,7 +5,16 @@
void _stm_write_slowpath(object_t *obj)
{
+ assert(_seems_to_be_running_transaction());
+ assert(!_is_in_nursery(obj));
+ assert(obj->stm_flags & GCFLAG_WRITE_BARRIER);
+ stm_read(obj);
+
+ LIST_APPEND(STM_PSEGMENT->modified_old_objects, obj);
+
+ LIST_APPEND(STM_PSEGMENT->objects_pointing_to_nursery, obj);
+ obj->stm_flags &= ~GCFLAG_WRITE_BARRIER;
}
static void reset_transaction_read_version(void)
@@ -54,6 +63,7 @@
}
assert(list_is_empty(STM_PSEGMENT->modified_old_objects));
+ assert(list_is_empty(STM_PSEGMENT->objects_pointing_to_nursery));
check_nursery_at_transaction_start();
}
@@ -75,6 +85,9 @@
static void _finish_transaction()
{
stm_thread_local_t *tl = STM_SEGMENT->running_thread;
+
+ list_clear(STM_PSEGMENT->objects_pointing_to_nursery);
+
release_thread_segment(tl);
/* cannot access STM_SEGMENT or STM_PSEGMENT from here ! */
}
diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -51,6 +51,7 @@
struct stm_segment_info_s pub;
struct list_s *modified_old_objects;
+ struct list_s *objects_pointing_to_nursery;
/* For debugging */
#ifndef NDEBUG
diff --git a/c8/stm/misc.c b/c8/stm/misc.c
--- a/c8/stm/misc.c
+++ b/c8/stm/misc.c
@@ -44,7 +44,6 @@
#ifdef STM_TESTS
-
long _stm_count_modified_old_objects(void)
{
if (STM_PSEGMENT->modified_old_objects == NULL)
@@ -52,10 +51,22 @@
return list_count(STM_PSEGMENT->modified_old_objects);
}
+long _stm_count_objects_pointing_to_nursery(void)
+{
+ if (STM_PSEGMENT->objects_pointing_to_nursery == NULL)
+ return -1;
+ return list_count(STM_PSEGMENT->objects_pointing_to_nursery);
+}
object_t *_stm_enum_modified_old_objects(long index)
{
return (object_t *)list_item(
STM_PSEGMENT->modified_old_objects, index);
}
+
+object_t *_stm_enum_objects_pointing_to_nursery(long index)
+{
+ return (object_t *)list_item(
+ STM_PSEGMENT->objects_pointing_to_nursery, index);
+}
#endif
diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c
--- a/c8/stm/nursery.c
+++ b/c8/stm/nursery.c
@@ -77,6 +77,8 @@
{
dprintf(("minor_collection commit=%d\n", (int)commit));
+ assert(list_is_empty(STM_PSEGMENT->objects_pointing_to_nursery));
+
throw_away_nursery(get_priv_segment(STM_SEGMENT->segment_num));
}
diff --git a/c8/stm/setup.c b/c8/stm/setup.c
--- a/c8/stm/setup.c
+++ b/c8/stm/setup.c
@@ -112,6 +112,7 @@
pr->pub.segment_num = i;
pr->pub.segment_base = segment_base;
pr->modified_old_objects = list_create();
+ pr->objects_pointing_to_nursery = list_create();
pr->pub.transaction_read_version = 0xff;
}
@@ -137,6 +138,8 @@
long i;
for (i = 1; i <= NB_SEGMENTS; i++) {
struct stm_priv_segment_info_s *pr = get_priv_segment(i);
+ assert(list_is_empty(pr->objects_pointing_to_nursery));
+ list_free(pr->objects_pointing_to_nursery);
list_free(pr->modified_old_objects);
}
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -75,7 +75,9 @@
bool _stm_in_transaction(stm_thread_local_t *tl);
void _stm_set_nursery_free_count(uint64_t free_count);
long _stm_count_modified_old_objects(void);
+long _stm_count_objects_pointing_to_nursery(void);
object_t *_stm_enum_modified_old_objects(long index);
+object_t *_stm_enum_objects_pointing_to_nursery(long index);
#endif
/* ==================== HELPERS ==================== */
diff --git a/c8/test/support.py b/c8/test/support.py
--- a/c8/test/support.py
+++ b/c8/test/support.py
@@ -54,7 +54,9 @@
object_t * _get_ptr(object_t *obj, int n);
long _stm_count_modified_old_objects(void);
+long _stm_count_objects_pointing_to_nursery(void);
object_t *_stm_enum_modified_old_objects(long index);
+object_t *_stm_enum_objects_pointing_to_nursery(long index);
void *memset(void *s, int c, size_t n);
diff --git a/c8/test/test_basic.py b/c8/test/test_basic.py
--- a/c8/test/test_basic.py
+++ b/c8/test/test_basic.py
@@ -51,7 +51,7 @@
stm_write(lp1)
assert stm_was_written(lp1)
assert modified_old_objects() == [] # object not old
- assert objects_pointing_to_nursery() == None # short transaction
+ assert objects_pointing_to_nursery() == [] # short transaction
self.commit_transaction()
def test_allocate_old(self):
@@ -214,7 +214,7 @@
self.commit_transaction()
-
+
def test_start_transaction_updates(self):
self.start_transaction()
lp1 = stm_allocate(16)
@@ -233,7 +233,7 @@
self.switch(0)
self.start_transaction()
assert stm_get_char(lp1) == 'b'
-
+
def test_resolve_no_conflict_empty(self):
self.start_transaction()
@@ -254,11 +254,11 @@
self.commit_transaction()
lp1 = self.pop_root()
# 'a' in SHARED_PAGE
-
+
self.start_transaction()
-
+
self.switch(1)
-
+
self.start_transaction()
stm_write(lp1) # privatize page
p1 = stm_get_real_address(lp1)
@@ -307,7 +307,7 @@
self.push_root(lp1)
self.commit_transaction()
lp1 = self.pop_root()
-
+
self.start_transaction()
stm_read(lp1)
#
@@ -325,7 +325,7 @@
self.push_root(lp1)
self.commit_transaction()
lp1 = self.pop_root()
-
+
self.start_transaction()
#
self.switch(1)
@@ -344,7 +344,7 @@
self.push_root(lp1)
self.commit_transaction()
lp1 = self.pop_root()
-
+
self.start_transaction()
stm_write(lp1) # acquire lock
#
More information about the pypy-commit
mailing list