We changed the convention a while ago so that BaseReg is returned to
the scheduler in R1, because BaseReg may change during the run of a
thread, e.g. during a foreign call. A few places got missed,
mostly for very rare events.
Should fix concprog001, although I'm not able to reliably reproduce
the failure.
RTS_FUN(stg_returnToSched);
RTS_FUN(stg_returnToSchedNotPaused);
RTS_FUN(stg_returnToSchedButFirst);
RTS_FUN(stg_returnToSched);
RTS_FUN(stg_returnToSchedNotPaused);
RTS_FUN(stg_returnToSchedButFirst);
+RTS_FUN(stg_threadFinished);
RTS_FUN(stg_init_finish);
RTS_FUN(stg_init);
RTS_FUN(stg_init_finish);
RTS_FUN(stg_init);
if (r != 0::CInt) {
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
if (r != 0::CInt) {
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
- R1 = ThreadFinished;
- jump StgReturn;
+ jump stg_threadFinished;
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
if (r != 0::CInt) {
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
if (r != 0::CInt) {
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
- R1 = ThreadFinished;
- jump StgReturn;
+ jump stg_threadFinished;
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
foreign "C" throwToSingleThreaded(MyCapability() "ptr",
target "ptr", exception "ptr")[R1,R2];
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
foreign "C" throwToSingleThreaded(MyCapability() "ptr",
target "ptr", exception "ptr")[R1,R2];
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
- R1 = ThreadFinished;
- jump StgReturn;
+ jump stg_threadFinished;
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
StgTSO_what_next(CurrentTSO) = ThreadKilled::I16;
SAVE_THREAD_STATE(); /* inline! */
StgTSO_what_next(CurrentTSO) = ThreadKilled::I16;
SAVE_THREAD_STATE(); /* inline! */
- /* The return code goes in BaseReg->rRet, and BaseReg is returned in R1 */
- StgRegTable_rRet(BaseReg) = ThreadFinished;
- R1 = BaseReg;
-
- jump StgReturn;
+ jump stg_threadFinished;
}
/* Ok, Sp points to the enclosing CATCH_FRAME or CATCH_STM_FRAME. Pop everything
}
/* Ok, Sp points to the enclosing CATCH_FRAME or CATCH_STM_FRAME. Pop everything
foreign "C" threadPaused (MyCapability() "ptr", CurrentTSO "ptr") [];
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
foreign "C" threadPaused (MyCapability() "ptr", CurrentTSO "ptr") [];
if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
- R1 = ThreadFinished;
- jump StgReturn;
+ jump stg_threadFinished;
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
} else {
LOAD_THREAD_STATE();
ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
+stg_threadFinished
+{
+ StgRegTable_rRet(BaseReg) = ThreadFinished;
+ R1 = BaseReg;
+ jump StgReturn;
+}
+
/* -----------------------------------------------------------------------------
Strict IO application - performing an IO action and entering its result.
/* -----------------------------------------------------------------------------
Strict IO application - performing an IO action and entering its result.