From ab89dc190a9004d2ec9547c7e64eab8853ab9837 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 4 Dec 2007 11:09:47 +0000 Subject: [PATCH] forkIO starts the new thread blocked if the parent is blocked (#1048) --- rts/PrimOps.cmm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index 444bbe7..373f192 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -920,6 +920,12 @@ forkzh_fast ("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr", RtsFlags_GcFlags_initialStkSize(RtsFlags), closure "ptr") []; + + /* start blocked if the current thread is blocked */ + StgTSO_flags(threadid) = + StgTSO_flags(threadid) | (StgTSO_flags(CurrentTSO) & + (TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32)); + foreign "C" scheduleThread(MyCapability() "ptr", threadid "ptr") []; // switch at the earliest opportunity @@ -943,6 +949,12 @@ forkOnzh_fast ("ptr" threadid) = foreign "C" createIOThread( MyCapability() "ptr", RtsFlags_GcFlags_initialStkSize(RtsFlags), closure "ptr") []; + + /* start blocked if the current thread is blocked */ + StgTSO_flags(threadid) = + StgTSO_flags(threadid) | (StgTSO_flags(CurrentTSO) & + (TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32)); + foreign "C" scheduleThreadOn(MyCapability() "ptr", cpu, threadid "ptr") []; // switch at the earliest opportunity -- 1.7.10.4