- // Retry in the alternative code: propagate
- W_ other_trec;
- other_trec = StgCatchRetryFrame_first_code_trec(frame);
- r = foreign "C" stmCommitNestedTransaction(MyCapability() "ptr", other_trec "ptr") [];
- if (r != 0) {
- r = foreign "C" stmCommitNestedTransaction(MyCapability() "ptr", trec "ptr") [];
- } else {
- foreign "C" stmAbortTransaction(MyCapability() "ptr", trec "ptr") [];
- }
- if (r != 0) {
- // Merge between siblings succeeded: commit it back to enclosing transaction
- // and then propagate the retry
- StgTSO_trec(CurrentTSO) = outer;
- Sp = Sp + SIZEOF_StgCatchRetryFrame;
- goto retry_pop_stack;
- } else {
- // Merge failed: we musn't propagate the retry. Try both paths again.
- "ptr" trec = foreign "C" stmStartTransaction(MyCapability() "ptr", outer "ptr") [];
- StgCatchRetryFrame_first_code_trec(frame) = trec;
- StgCatchRetryFrame_running_alt_code(frame) = 0 :: CInt; // false;
- StgTSO_trec(CurrentTSO) = trec;
- R1 = StgCatchRetryFrame_first_code(frame);
- jump stg_ap_v_fast;
- }
+ // Retry in the alternative code: propagate the retry
+ StgTSO_trec(CurrentTSO) = outer;
+ Sp = Sp + SIZEOF_StgCatchRetryFrame;
+ goto retry_pop_stack;