Author: Armin Rigo <ar...@tunes.org> Branch: c8-locking Changeset: r1748:fe2ead99a2d3 Date: 2015-04-09 12:41 +0200 http://bitbucket.org/pypy/stmgc/changeset/fe2ead99a2d3/
Log: A summary of the locks used in c8. diff --git a/c8/LOCKS b/c8/LOCKS new file mode 100644 --- /dev/null +++ b/c8/LOCKS @@ -0,0 +1,55 @@ + + +main lock-free operation +======================== + +The main lock-free operation is at commit time: the compare-and-swap +that attaches a new log entry after 'last_commit_log_entry'. + + + +modification_lock +================= + +one per segment. + +acquired on segment N when we want to read or write the segment N's +copy of 'modified_old_objects', the backup copies, etc. + +an important user is _stm_validate(): it locks the current segment, +and all the other segments out of which it is going to read data + +could be improved, because _stm_validate() writes into the current +segment but only reads the other ones. So far it mostly serializes +calls to _stm_validate(): if we have two of them starting at roughly +the same time, they need both to acquire the modification_lock of at +least the segment that did the most recent commit --- even though it +could proceed in parallel if they could both realize that they only +want to read from that same segment. + +same, handle_segfault_in_page() acquires two modification_locks: the +current segment (which needs to be written to), and the +'copy_from_segnum' (which only needs to be read from). + +the current segment modification_lock is also acquired briefly +whenever we change our segment's 'modified_old_objects'. + + + +privatization_lock +================== + +one per segment. Works like a single "reader-writer" lock: each +segment acquires either only its copy ("reader") or all of them +("writer"). + +"Reader" status is needed to call get_page_status_in(). +"Writer" status is needed to call set_page_status_in/page_mark_(in)accessible. + +Essential "writers": +- handle_segfault_in_page(), but it only writes the status for the current seg + +Essential "readers": +- _stm_validate() +- push_large_overflow_objects_to_other_segments() +- nursery.c calling synchronize_object_enqueue() diff --git a/c8/stm/core.c b/c8/stm/core.c --- a/c8/stm/core.c +++ b/c8/stm/core.c @@ -871,6 +871,8 @@ static void touch_all_pages_of_obj(object_t *obj, size_t obj_size) { + /* XXX should it be simpler, just really trying to read a dummy + byte in each page? */ int my_segnum = STM_SEGMENT->segment_num; uintptr_t end_page, first_page = ((uintptr_t)obj) / 4096UL; _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit