Author: Remi Meier Branch: c7-refactor Changeset: r807:656a920108f2 Date: 2014-02-21 13:55 +0100 http://bitbucket.org/pypy/stmgc/changeset/656a920108f2/
Log: more cleanups in test_random diff --git a/c7/test/test_random.py b/c7/test/test_random.py --- a/c7/test/test_random.py +++ b/c7/test/test_random.py @@ -17,6 +17,12 @@ exec cmd in globals(), self.content +def raising_call(conflict, func, *args): + arguments = ", ".join(map(str, args)) + if conflict: + return "py.test.raises(Conflict, %s, %s)" % (func, arguments) + return "%s(%s)" % (func, arguments) + class WriteWriteConflictNotTestable(Exception): # How can I test a write-write conflict between @@ -227,6 +233,16 @@ self.ex.do('# conflict while pushing to other threads: %s' % trs.objs_in_conflict) + def check_if_can_become_inevitable(self, trs): + assert not trs.check_must_abort() + for ts in self.thread_states: + other_trs = ts.transaction_state + if (other_trs and trs is not other_trs + and other_trs.inevitable): + self.ex.do("# there is another inevitable transaction:") + trs.set_must_abort() + break + def check_for_write_write_conflicts(self, trs): assert not trs.check_must_abort() for ts in self.thread_states: @@ -284,9 +300,7 @@ # if aborts: thread_state.abort_transaction() - ex.do('py.test.raises(Conflict, self.commit_transaction)') - else: - ex.do('self.commit_transaction()') + ex.do(raising_call(aborts, "self.commit_transaction")) class OpAbortTransaction(Operation): def do(self, ex, global_state, thread_state): @@ -300,20 +314,15 @@ class OpBecomeInevitable(Operation): def do(self, ex, global_state, thread_state): trs = thread_state.transaction_state - for ts in global_state.thread_states: - other_trs = ts.transaction_state - if (other_trs and trs is not other_trs - and other_trs.inevitable): - trs.set_must_abort() - break + global_state.check_if_can_become_inevitable(trs) thread_state.push_roots(ex) + ex.do(raising_call(trs.check_must_abort(), + "stm_become_inevitable")) if trs.check_must_abort(): thread_state.abort_transaction() - ex.do('py.test.raises(Conflict, stm_become_inevitable)') else: trs.inevitable = True - ex.do('stm_become_inevitable()') thread_state.pop_roots(ex) thread_state.reload_roots(ex) @@ -362,18 +371,10 @@ class OpWrite(Operation): def do(self, ex, global_state, thread_state): r = thread_state.get_random_root() + trs = thread_state.transaction_state is_ref = global_state.has_ref_type(r) - if is_ref: - v = thread_state.get_random_root() - else: - v = ord(global_state.rnd.choice("abcdefghijklmnop")) - trs = thread_state.transaction_state # - if is_ref: - ex.do("idx = (stm_get_obj_size(%s) - HDR) / WORD - 1" % r) - else: - ex.do("offset = stm_get_obj_size(%s) - 1" % r) - # + # check for possible write-write conflict: was_written = False try: # HACK to avoid calling write_root() just yet because we have to @@ -384,23 +385,27 @@ except WriteWriteConflictNotTestable: if not was_written: trs.write_set.remove(r) - ex.do("# this is an untestable write-write conflict between an") - ex.do("# inevitable and a normal transaction :(") + ex.do("# writing to %s produces an untestable write-write" % r) + ex.do("# conflict between an inevitable and a normal transaction :(") return # + # decide on a value to write + if is_ref: + v = thread_state.get_random_root() + ex.do("idx = (stm_get_obj_size(%s) - HDR) / WORD - 1" % r) + else: + v = ord(global_state.rnd.choice("abcdefghijklmnop")) + ex.do("offset = stm_get_obj_size(%s) - 1" % r) trs.write_root(r, v) # if trs.check_must_abort(): thread_state.abort_transaction() - if is_ref: - ex.do("py.test.raises(Conflict, stm_set_ref, %s, idx, %s)" % (r, v)) - else: - ex.do("py.test.raises(Conflict, stm_set_char, %s, %s, offset)" % (r, repr(chr(v)))) + if is_ref: + ex.do(raising_call(trs.check_must_abort(), + "stm_set_ref", r, "idx", v)) else: - if is_ref: - ex.do("stm_set_ref(%s, idx, %s)" % (r, v)) - else: - ex.do("stm_set_char(%s, %s, offset)" % (r, repr(chr(v)))) + ex.do(raising_call(trs.check_must_abort(), + "stm_set_char", r, repr(chr(v)), "offset")) class OpRead(Operation): def do(self, ex, global_state, thread_state): @@ -445,9 +450,10 @@ # if conflicts: thread_state.abort_transaction() - ex.do('py.test.raises(Conflict, self.switch, %s)' % thread_state.num) - else: - ex.do('self.switch(%s)' % thread_state.num) + + ex.do(raising_call(conflicts, + "self.switch", thread_state.num)) + # ========== TEST GENERATION ========== _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit