Nucleus
Barry Object locking e8e484f (3 years, 3 months ago)
diff --git a/task/queue.c b/task/queue.c
index 670c26c..071a1fe 100644
--- a/task/queue.c
+++ b/task/queue.c
@@ -38,18 +38,22 @@ task_queue_delete(Object *obj)
void
add_to_queue(TaskQueue *queue, Task *task)
{
+ lock(queue);
if (!queue->start)
queue->start = get(task);
else
queue->end->next = get(task);
queue->end = task;
task->next = NULL;
+ unlock(queue);
}
/* Remove a Task from a Task Queue */
void
remove_from_queue(TaskQueue *queue, Task *task)
{
+ lock(queue);
+
/* Start of queue */
if (queue->start == task) {
queue->start = task->next;
@@ -61,8 +65,10 @@ remove_from_queue(TaskQueue *queue, Task *task)
for (prev = queue->start; prev->next; prev = prev->next)
if (prev->next == task)
break;
- if (!prev->next)
+ if (!prev->next) {
+ unlock(queue);
return;
+ }
prev->next = task->next;
@@ -72,13 +78,17 @@ found:
task->next = NULL;
put(task);
+
+ unlock(queue);
}
/* Remove the first Task from a Task Queue */
Task *
pop_from_queue(TaskQueue *queue)
{
+ lock(queue);
Task *head = get(queue->start);
remove_from_queue(queue, queue->start);
+ unlock(queue);
return head;
}
diff --git a/task/scheduler.c b/task/scheduler.c
index 115722e..cad926d 100644
--- a/task/scheduler.c
+++ b/task/scheduler.c
@@ -17,9 +17,11 @@ TaskQueue *readyQueue[PRIORITY_COUNT];
static void
switch_to_task(Task *task)
{
+ lock(current);
asm volatile("mov %%esp, %0" : "=r" (current->esp));
asm volatile("mov %%ebp, %0" : "=r" (current->ebp));
current->eip = (uintptr_t) &&end;
+ unlock(current);
put(current);
current = task; /* Use the passed reference */