From b7b8a5d2712612c0cced9fbdf9ae27b2a066eb14 Mon Sep 17 00:00:00 2001 From: NicJA Date: Fri, 1 May 2015 14:06:37 +0000 Subject: [PATCH] lock access to the lists while we read them git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@50557 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/task/LockTaskList.c | 4 ++-- rom/task/init.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/rom/task/LockTaskList.c b/rom/task/LockTaskList.c index 3b6833e12b..e7ea3f8265 100644 --- a/rom/task/LockTaskList.c +++ b/rom/task/LockTaskList.c @@ -59,8 +59,8 @@ if ((taskList = AllocMem(sizeof(struct TaskListPrivate), MEMF_CLEAR)) != NULL) { taskList->tlp_Tasks = &TaskResBase->trb_TaskList; - taskList->tlp_Next = GetHead(taskList->tlp_Tasks); - AddTail(&TaskResBase->trb_LockedLists, taskList->tlp_Node); + taskList->tlp_Next = (struct TaskListEntry *)GetHead(taskList->tlp_Tasks); + AddTail(&TaskResBase->trb_LockedLists, &taskList->tlp_Node); } return (struct TaskList *)taskList; diff --git a/rom/task/init.c b/rom/task/init.c index 53a5836680..49af542dba 100644 --- a/rom/task/init.c +++ b/rom/task/init.c @@ -19,6 +19,9 @@ struct TaskResBase *internTaskResBase = NULL; static LONG taskres_Init(struct TaskResBase *TaskResBase) { +#if defined(__AROSEXEC_SMP__) + spinlock_t *listLock; +#endif struct TaskListEntry *taskEntry = NULL; struct Task *curTask = NULL; @@ -37,9 +40,29 @@ static LONG taskres_Init(struct TaskResBase *TaskResBase) /* Add existing tasks to our internal list .. - TODO: get the running tasks from all cores .. */ - +#if defined(__AROSEXEC_SMP__) + listLock = KrnSpinLock(&SysBase->TaskRunningSpinLock, SPINLOCK_MODE_READ) + ForeachNode(&SysBase->TaskRunning, curTask) + { + if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL) + { + taskEntry->tle_Task = curTask; + AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node); + } + } + KrnSpinUnLock(listLock); + listLock = KrnSpinLock(&SysBase->TaskReadySpinLock, SPINLOCK_MODE_READ) +#else + if (SysBase->ThisTask) + { + if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL) + { + taskEntry->tle_Task = SysBase->ThisTask; + AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node); + } + } +#endif ForeachNode(&SysBase->TaskReady, curTask) { if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL) @@ -48,6 +71,10 @@ static LONG taskres_Init(struct TaskResBase *TaskResBase) AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node); } } +#if defined(__AROSEXEC_SMP__) + KrnSpinUnLock(listLock); + listLock = KrnSpinLock(&SysBase->TaskWaitSpinLock, SPINLOCK_MODE_READ) +#endif ForeachNode(&SysBase->TaskWait, curTask) { if ((taskEntry = AllocMem(sizeof(struct TaskListEntry), MEMF_CLEAR)) != NULL) @@ -56,6 +83,9 @@ static LONG taskres_Init(struct TaskResBase *TaskResBase) AddTail(&TaskResBase->trb_TaskList, &taskEntry->tle_Node); } } +#if defined(__AROSEXEC_SMP__) + KrnSpinUnLock(listLock); +#endif return TRUE; } -- 2.11.4.GIT