*/
#include "Rts.h"
#include "Schedule.h"
+#include "AwaitEvent.h"
#include <windows.h>
#include "win32/AsyncIO.h"
-#if defined(THREADED_RTS)
-#include "Capability.h"
-#endif
// Used to avoid calling abandonRequestWait() if we don't need to.
// Protected by sched_mutex.
{
int ret;
-#ifdef THREADED_RTS
- // Small optimisation: we don't want the waiting thread to wake
- // up straight away just because a previous returning worker has
- // called abandonRequestWait(). If the event is no longer needed,
- // reset it. We must do this inside the sched_mutex.
- if (!needToYieldToReturningWorker()) {
- resetAbandonRequestWait();
- }
-#endif
-
do {
/* Try to de-queue completed IO requests
*/
workerWaitingForRequests = 1;
- RELEASE_LOCK(&sched_mutex);
ret = awaitRequests(wait);
- ACQUIRE_LOCK(&sched_mutex);
workerWaitingForRequests = 0;
if (!ret) {
return; /* still hold the lock */
//
// - we were interrupted
// - new threads have arrived
- // - another worker wants to take over (THREADED_RTS)
} while (wait
&& !interrupted
- && run_queue_hd == END_TSO_QUEUE
-#ifdef THREADED_RTS
- && !needToYieldToReturningWorker()
-#endif
+ && emptyRunQueue(&MainCapability)
);
}
-
-#ifdef THREADED_RTS
-void
-wakeBlockedWorkerThread()
-{
- if (workerWaitingForRequests) {
- abandonRequestWait();
- }
-}
-#endif
#include "RtsUtils.h"
#include "RtsFlags.h"
#include "AsyncIO.h"
+#include "RtsSignals.h"
extern int stg_InstallConsoleEvent(int action, StgStablePtr *handler);
handler = deRefStablePtr((StgStablePtr)console_handler);
while (stg_pending_events > 0) {
stg_pending_events--;
- scheduleThread(
- createIOThread(RtsFlags.GcFlags.initialStkSize,
- rts_apply((StgClosure *)handler,
- rts_mkInt(stg_pending_buf[stg_pending_events]))));
+ scheduleThread(&MainCapability,
+ createIOThread(&MainCapability,
+ RtsFlags.GcFlags.initialStkSize,
+ rts_apply(&MainCapability,
+ (StgClosure *)handler,
+ rts_mkInt(&MainCapability,
+ stg_pending_buf[stg_pending_events]))));
}
unblockUserSignals();
}