diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-10-11 14:02:51 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-10-12 08:08:37 -0400 |
commit | 481467a5ceb07bb28bb6edb1569c86ff3cac315f (patch) | |
tree | ca08c2e91a2c5ef1bbeb5fb240c796736a8bbd57 | |
parent | 64a390d9c57b35edb6e7cf09b9324b43a3d08671 (diff) | |
download | haskell-481467a5ceb07bb28bb6edb1569c86ff3cac315f.tar.gz |
rts: Don't hint inlining of appendToRunQueue
These hints have resulted in compile-time warnings due to failed
inlinings for quite some time. Moreover, it's quite unlikely that
inlining them is all that beneficial given that they are rather sizeable
functions.
Resolves #22280.
-rw-r--r-- | rts/Schedule.c | 55 | ||||
-rw-r--r-- | rts/Schedule.h | 57 |
2 files changed, 58 insertions, 54 deletions
diff --git a/rts/Schedule.c b/rts/Schedule.c index bc0e7d3acf..028578d6dc 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -2915,6 +2915,61 @@ deleteThread_(StgTSO *tso) } #endif +/* + * Run queue manipulation + */ + +void +appendToRunQueue (Capability *cap, StgTSO *tso) +{ + ASSERT(tso->_link == END_TSO_QUEUE); + if (cap->run_queue_hd == END_TSO_QUEUE) { + cap->run_queue_hd = tso; + tso->block_info.prev = END_TSO_QUEUE; + } else { + setTSOLink(cap, cap->run_queue_tl, tso); + setTSOPrev(cap, tso, cap->run_queue_tl); + } + cap->run_queue_tl = tso; + cap->n_run_queue++; +} + +void +pushOnRunQueue (Capability *cap, StgTSO *tso) +{ + setTSOLink(cap, tso, cap->run_queue_hd); + tso->block_info.prev = END_TSO_QUEUE; + if (cap->run_queue_hd != END_TSO_QUEUE) { + setTSOPrev(cap, cap->run_queue_hd, tso); + } + cap->run_queue_hd = tso; + if (cap->run_queue_tl == END_TSO_QUEUE) { + cap->run_queue_tl = tso; + } + cap->n_run_queue++; +} + +StgTSO *popRunQueue (Capability *cap) +{ + ASSERT(cap->n_run_queue > 0); + StgTSO *t = cap->run_queue_hd; + ASSERT(t != END_TSO_QUEUE); + cap->run_queue_hd = t->_link; + + StgTSO *link = RELAXED_LOAD(&t->_link); + if (link != END_TSO_QUEUE) { + link->block_info.prev = END_TSO_QUEUE; + } + RELAXED_STORE(&t->_link, END_TSO_QUEUE); // no write barrier req'd + + if (cap->run_queue_hd == END_TSO_QUEUE) { + cap->run_queue_tl = END_TSO_QUEUE; + } + cap->n_run_queue--; + return t; +} + + /* ----------------------------------------------------------------------------- raiseExceptionHelper diff --git a/rts/Schedule.h b/rts/Schedule.h index 5aaafd9d88..eda0aa3f79 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -136,67 +136,16 @@ void resurrectThreads (StgTSO *); * NOTE: tso->link should be END_TSO_QUEUE before calling this macro. * ASSUMES: cap->running_task is the current task. */ -EXTERN_INLINE void -appendToRunQueue (Capability *cap, StgTSO *tso); - -EXTERN_INLINE void -appendToRunQueue (Capability *cap, StgTSO *tso) -{ - ASSERT(tso->_link == END_TSO_QUEUE); - if (cap->run_queue_hd == END_TSO_QUEUE) { - cap->run_queue_hd = tso; - tso->block_info.prev = END_TSO_QUEUE; - } else { - setTSOLink(cap, cap->run_queue_tl, tso); - setTSOPrev(cap, tso, cap->run_queue_tl); - } - cap->run_queue_tl = tso; - cap->n_run_queue++; -} +void appendToRunQueue (Capability *cap, StgTSO *tso); /* Push a thread on the beginning of the run queue. * ASSUMES: cap->running_task is the current task. */ -EXTERN_INLINE void -pushOnRunQueue (Capability *cap, StgTSO *tso); - -EXTERN_INLINE void -pushOnRunQueue (Capability *cap, StgTSO *tso) -{ - setTSOLink(cap, tso, cap->run_queue_hd); - tso->block_info.prev = END_TSO_QUEUE; - if (cap->run_queue_hd != END_TSO_QUEUE) { - setTSOPrev(cap, cap->run_queue_hd, tso); - } - cap->run_queue_hd = tso; - if (cap->run_queue_tl == END_TSO_QUEUE) { - cap->run_queue_tl = tso; - } - cap->n_run_queue++; -} +void pushOnRunQueue (Capability *cap, StgTSO *tso); /* Pop the first thread off the runnable queue. */ -INLINE_HEADER StgTSO * -popRunQueue (Capability *cap) -{ - ASSERT(cap->n_run_queue > 0); - StgTSO *t = cap->run_queue_hd; - ASSERT(t != END_TSO_QUEUE); - cap->run_queue_hd = t->_link; - - StgTSO *link = RELAXED_LOAD(&t->_link); - if (link != END_TSO_QUEUE) { - link->block_info.prev = END_TSO_QUEUE; - } - RELAXED_STORE(&t->_link, END_TSO_QUEUE); // no write barrier req'd - - if (cap->run_queue_hd == END_TSO_QUEUE) { - cap->run_queue_tl = END_TSO_QUEUE; - } - cap->n_run_queue--; - return t; -} +StgTSO *popRunQueue (Capability *cap); INLINE_HEADER StgTSO * peekRunQueue (Capability *cap) |