Author: Remi Meier <[email protected]>
Branch:
Changeset: r1361:758cb4ddefea
Date: 2014-09-05 15:26 +0200
http://bitbucket.org/pypy/stmgc/changeset/758cb4ddefea/
Log: reset modified objs on abort
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -145,7 +145,8 @@
not_found:
/* copy from page */
- obj_size = stmcb_size_rounded_up(REAL_ADDRESS(get_segment_base(from_seg),
obj));
+ obj_size = stmcb_size_rounded_up(
+ (struct object_s*)REAL_ADDRESS(get_segment_base(from_seg), obj));
memcpy(realobj,
REAL_ADDRESS(get_segment_base(from_seg), obj),
obj_size);
@@ -450,6 +451,39 @@
s_mutex_unlock();
}
+void reset_modified_from_backup_copies(int segment_num)
+{
+#pragma push_macro("STM_PSEGMENT")
+#pragma push_macro("STM_SEGMENT")
+#undef STM_PSEGMENT
+#undef STM_SEGMENT
+ acquire_modified_objs_lock(segment_num);
+
+ struct stm_priv_segment_info_s *pseg = get_priv_segment(segment_num);
+ struct tree_s *tree = pseg->modified_old_objects;
+ wlog_t *item;
+ TREE_LOOP_FORWARD(tree, item); {
+ object_t *obj = (object_t*)item->addr;
+ struct object_s* bk_obj = (struct object_s *)item->val;
+ size_t obj_size;
+
+ obj_size = stmcb_size_rounded_up(bk_obj);
+ assert(obj_size < 4096); /* XXX */
+
+ memcpy(REAL_ADDRESS(pseg->pub.segment_base, obj),
+ bk_obj, obj_size);
+ assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* not written */
+
+ free(bk_obj);
+ } TREE_LOOP_END;
+
+ tree_clear(tree);
+
+ release_modified_objs_lock(segment_num);
+
+#pragma pop_macro("STM_SEGMENT")
+#pragma pop_macro("STM_PSEGMENT")
+}
static void abort_data_structures_from_segment_num(int segment_num)
{
@@ -461,7 +495,7 @@
throw_away_nursery(pseg);
- /* XXX: reset_modified_from_other_segments(segment_num); */
+ reset_modified_from_backup_copies(segment_num);
stm_thread_local_t *tl = pseg->pub.running_thread;
#ifdef STM_NO_AUTOMATIC_SETJMP
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit