diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/IOManager.h | 15 | ||||
-rw-r--r-- | rts/Schedule.c | 14 | ||||
-rw-r--r-- | 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" |