From e8ca17b6107e8bcd727a0efff5cae1a680a52ebb Mon Sep 17 00:00:00 2001 From: NicJA Date: Tue, 28 Feb 2017 05:11:33 +0000 Subject: [PATCH] fix settaskpri's behaviour. disable before obtaining the lock. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@53957 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/exec/settaskpri.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/rom/exec/settaskpri.c b/rom/exec/settaskpri.c index eb0d74c574..a9b22a14c8 100644 --- a/rom/exec/settaskpri.c +++ b/rom/exec/settaskpri.c @@ -82,9 +82,11 @@ task_listlock = &PrivExecBase(SysBase)->TaskReadySpinLock; break; } - EXECTASK_SPINLOCK_LOCK(task_listlock, (task->tc_State == TS_READY) ? SPINLOCK_MODE_WRITE : SPINLOCK_MODE_READ); #endif Disable(); +#if defined(__AROSEXEC_SMP__) + EXECTASK_SPINLOCK_LOCK(task_listlock, (task->tc_State == TS_READY) ? SPINLOCK_MODE_WRITE : SPINLOCK_MODE_READ); +#endif /* Get returncode */ old = task->tc_Node.ln_Pri; @@ -102,23 +104,22 @@ Enqueue(&SysBase->TaskReady, &task->tc_Node); } - if ( #if defined(__AROSEXEC_SMP__) - (IntETask(task->tc_UnionETask.tc_ETask)->iet_CpuNumber == cpunum) && + EXECTASK_SPINLOCK_UNLOCK(task_listlock); + task_listlock = NULL; + if (IntETask(task->tc_UnionETask.tc_ETask)->iet_CpuNumber == cpunum) { #endif - ((task->tc_State == TS_RUN) || ( task->tc_Node.ln_Pri > thisTask->tc_Node.ln_Pri)) - ) + if ( task->tc_Node.ln_Pri > thisTask->tc_Node.ln_Pri) { -#if defined(__AROSEXEC_SMP__) - EXECTASK_SPINLOCK_UNLOCK(task_listlock); - task_listlock = NULL; -#endif + D(bug("[Exec] SetTaskPri: Task needs reschedule...\n");) Reschedule(); } #if defined(__AROSEXEC_SMP__) - else + } + else if (task->tc_State == TS_RUN) { - bug("[Exec] SetTaskPri:\n"); + D(bug("[Exec] SetTaskPri: changing priority of task running on another cpu (%03u)\n", IntETask(task->tc_UnionETask.tc_ETask)->iet_CpuNumber);) + KrnScheduleCPU(IntETask(task->tc_UnionETask.tc_ETask)->iet_CpuAffinity); } #endif } -- 2.11.4.GIT