BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / e8e484f3952a9a3b7df1c3f5763a794a51ea6966 / task

// Related

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 */