From 39a91f60d958247cffdd6e10ac58030bc72ce464 Mon Sep 17 00:00:00 2001 From: Duncan Coutts Date: Tue, 14 Dec 2021 16:13:51 +0000 Subject: Move macros for checking for pending IO or timers from Schedule.h to Schedule.c and IOManager.h This is just moving, the next step will be to rejig them slightly. For the non-threaded RTS the scheduler needs to be able to test for there being pending I/O operation or pending timers. The implementation of these tests should really be considered to be part of the I/O managers and not part of the scheduler. --- rts/IOManager.h | 15 +++++++++++++++ rts/Schedule.c | 14 ++++++++++++++ rts/Schedule.h | 16 ---------------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/rts/IOManager.h b/rts/IOManager.h index 515cfc2f85..72bfac1fb0 100644 --- a/rts/IOManager.h +++ b/rts/IOManager.h @@ -155,5 +155,20 @@ void insertIntoSleepingQueue(StgTSO *tso, LowResTime target); #define USED_IF_THREADS_AND_NOT_MINGW32 STG_UNUSED #endif +/* ----------------------------------------------------------------------------- + * INLINE functions... private from here on down. + * + * Some of these hooks are performance sensitive so parts of them are + * implemented here so they can be inlined. + * ----------------------------------------------------------------------------- + */ + +/* TODO: rename and replace these macros by inline functions + * these have been moved here from Scheduler.h + */ +#if !defined(THREADED_RTS) +#define EMPTY_BLOCKED_QUEUE(cap) (emptyQueue(cap->iomgr->blocked_queue_hd)) +#define EMPTY_SLEEPING_QUEUE(cap) (emptyQueue(cap->iomgr->sleeping_queue)) +#endif #include "EndPrivate.h" diff --git a/rts/Schedule.c b/rts/Schedule.c index 67e2ff4ee8..5d3789c31d 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -143,6 +143,7 @@ static void startWorkerTasks (uint32_t from USED_IF_THREADS, #endif static void scheduleStartSignalHandlers (Capability *cap); static void scheduleCheckBlockedThreads (Capability *cap); +static bool emptyThreadQueues(Capability *cap); static void scheduleProcessInbox(Capability **cap); static void scheduleDetectDeadlock (Capability **pcap, Task *task); static void schedulePushWork(Capability *cap, Task *task); @@ -167,6 +168,7 @@ static void deleteAllThreads (void); static void deleteThread_(StgTSO *tso); #endif + /* --------------------------------------------------------------------------- Main scheduling loop. @@ -916,6 +918,18 @@ scheduleCheckBlockedThreads(Capability *cap USED_IF_NOT_THREADS) #endif } +static bool +emptyThreadQueues(Capability *cap) +{ + return emptyRunQueue(cap) +#if !defined(THREADED_RTS) + // TODO replace this by a test that deferrs to the active I/O manager + && EMPTY_BLOCKED_QUEUE(cap) && EMPTY_SLEEPING_QUEUE(cap) +#endif + ; +} + + /* ---------------------------------------------------------------------------- * Detect deadlock conditions and attempt to resolve them. * ------------------------------------------------------------------------- */ diff --git a/rts/Schedule.h b/rts/Schedule.h index 64f9f7d166..b0898b9a4c 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -174,22 +174,6 @@ truncateRunQueue(Capability *cap) cap->n_run_queue = 0; } -#if !defined(THREADED_RTS) -#define EMPTY_BLOCKED_QUEUE(cap) (emptyQueue(cap->iomgr->blocked_queue_hd)) -#define EMPTY_SLEEPING_QUEUE(cap) (emptyQueue(cap->iomgr->sleeping_queue)) -#endif - -INLINE_HEADER bool -emptyThreadQueues(Capability *cap) -{ - return emptyRunQueue(cap) -#if !defined(THREADED_RTS) - // TODO replace this by a test that deferrs to the active I/O manager - && EMPTY_BLOCKED_QUEUE(cap) && EMPTY_SLEEPING_QUEUE(cap) -#endif - ; -} - #endif /* !IN_STG_CODE */ #include "EndPrivate.h" -- cgit v1.2.1