BarryServer : Git

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

// Related

Nucleus

Barry List find by index and concat functions c38b2e5 (3 years, 3 months ago)
diff --git a/include/nucleus/object.h b/include/nucleus/object.h
index 7f9554c..c380cbd 100644
--- a/include/nucleus/object.h
+++ b/include/nucleus/object.h
@@ -27,6 +27,7 @@ struct Spinlock {
 /* Object Type */
 struct ObjectType {
 	refcount_t usage;
+	const char *name;
 	size_t size;
 	ObjectList *objects;
 	void *(*alloc)(void);
@@ -57,7 +58,9 @@ void remove(ObjectList *list, void *addr);
 void *pop_from_start(ObjectList *list);
 void *pop_from_end(ObjectList *list);
 size_t count(ObjectList *list);
+void *get_nth_item(ObjectList *list, off_t n);
 void iterate(ObjectList *list, iterate_callback_t callback, void *data);
 ObjectList *copy_list(ObjectList *list);
+void concat_list(ObjectList *src, ObjectList *dest);
 
 #endif
diff --git a/object/list.c b/object/list.c
index 8581330..4b3f3c7 100644
--- a/object/list.c
+++ b/object/list.c
@@ -40,8 +40,8 @@ create_list(ObjectType *type)
 void
 destroy_list(ObjectList *list)
 {
-	while (list->start)
-		remove(list, list->start);
+	while (list->entries > 0)
+		remove(list, list->start->obj);
 }
 
 /* Add an Object to a List */
@@ -138,15 +138,39 @@ count(ObjectList *list)
 	return list->entries;
 }
 
+/* Get the nth Object in a List */
+void *
+get_nth_item(ObjectList *list, off_t n)
+{
+	if (n > list->entries - 1)
+		return NULL;
+
+	struct ListEntry *entry;
+	if (n < (list->entries >> 1)) {
+		for (entry = list->start; entry; entry = entry->next)
+			if (n-- == 0)
+				break;
+	} else {
+		n = list->entries - 1 - n;
+		for (entry = list->end; entry; entry = entry->prev)
+			if (n-- == 0)
+				break;
+	}
+	return entry->obj;
+}
+
 /* Iterate a List with a callback */
 void
 iterate(ObjectList *list, iterate_callback_t callback, void *data)
 {
 	acquire(&list->lock);
 	struct ListEntry *entry;
-	for (entry = list->start; entry; entry = entry->next)
+	for (entry = list->start; entry; entry = entry->next) {
+		get(entry->obj);
 		if (callback(entry->obj, data))
 			break;
+		put(entry->obj);
+	}
 	release(&list->lock);
 }
 
@@ -162,3 +186,14 @@ copy_list(ObjectList *list)
 	release(&list->lock);
 	return newlist;
 }
+
+/* Concatenate one list onto the end of another */
+void
+concat_list(ObjectList *src, ObjectList *dest)
+{
+	acquire(&src->lock);
+	struct ListEntry *entry;
+	for (entry = src->start; entry; entry = entry->next)
+		add(dest, entry->obj);
+	release(&src->lock);
+}