BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / bb0cb7718204df7c0cbaf87484b1def3c4b2880f / object / list.c

// Related

Nucleus

Barry Per-CPU Scheduler bb0cb77 (3 years, 2 months ago)
diff --git a/object/list.c b/object/list.c
index 6745f28..a4e2f17 100644
--- a/object/list.c
+++ b/object/list.c
@@ -72,7 +72,8 @@ add(ObjectList *list, void *addr)
 	if (list->type && obj->type != list->type)
 		return;
 
-	acquire(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		acquire(&list->lock);
 
 	struct ListEntry *entry, *next;
 	entry = kmalloc(sizeof(struct ListEntry));
@@ -106,7 +107,8 @@ end:
 		list->end = entry;
 	}
 
-	release(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		release(&list->lock);
 }
 
 /* Remove an Object from a List */
@@ -119,7 +121,8 @@ remove(ObjectList *list, void *addr)
 		return;
 	if (list->type && obj->type != list->type)
 		return;
-	acquire(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		acquire(&list->lock);
 
 	/* Search for object */
 	struct ListEntry *entry;
@@ -148,7 +151,8 @@ remove(ObjectList *list, void *addr)
 		put(obj);
 	list->entries--;
 	kfree(entry);
-	release(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		release(&list->lock);
 }
 
 /* Pop the first Object in a List */
@@ -157,10 +161,12 @@ pop_from_start(ObjectList *list)
 {
 	if (!list->start)
 		return NULL;
-	acquire(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		acquire(&list->lock);
 	Object *head = get(list->start->obj);
 	remove(list, head);
-	release(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		release(&list->lock);
 	return head;
 }
 
@@ -170,10 +176,12 @@ pop_from_end(ObjectList *list)
 {
 	if (!list->end)
 		return NULL;
-	acquire(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		acquire(&list->lock);
 	Object *tail = get(list->end->obj);
 	remove(list, tail);
-	release(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		release(&list->lock);
 	return tail;
 }
 
@@ -211,11 +219,13 @@ copy_list(ObjectList *list)
 {
 	ObjectList *newlist = create_list(list->type, list->mode,
 	                                  list->compare);
-	acquire(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		acquire(&list->lock);
 	struct ListEntry *entry;
 	for (entry = list->start; entry; entry = entry->next)
 		add(newlist, entry->obj);
-	release(&list->lock);
+	if (list->mode != LIST_LOCKLESS)
+		release(&list->lock);
 	return newlist;
 }
 
@@ -223,11 +233,13 @@ copy_list(ObjectList *list)
 void
 concat_list(ObjectList *src, ObjectList *dest)
 {
-	acquire(&src->lock);
+	if (src->mode != LIST_LOCKLESS)
+		acquire(&src->lock);
 	struct ListEntry *entry;
 	for (entry = src->start; entry; entry = entry->next)
 		add(dest, entry->obj);
-	release(&src->lock);
+	if (src->mode != LIST_LOCKLESS)
+		release(&src->lock);
 }
 
 /* Iterate a List */