BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / d5bd2619c5610bfee27fa63d0c10d32149e6d244 / include / nucleus / object.h

// Related

Nucleus

Barry Object magic and ObjectList iteration d5bd261 (3 years, 2 months ago)
diff --git a/include/nucleus/object.h b/include/nucleus/object.h
index c380cbd..f7e9cf9 100644
--- a/include/nucleus/object.h
+++ b/include/nucleus/object.h
@@ -9,14 +9,13 @@ typedef struct Spinlock Spinlock;
 typedef struct ObjectType ObjectType;
 typedef struct Object Object;
 typedef struct ObjectList ObjectList;
+typedef struct Iterator Iterator;
 
 typedef struct Task Task;
 
-typedef int (*iterate_callback_t)(void *object, void *data);
-
 /* Spinlock */
 struct Spinlock {
-	char locked;
+	_Atomic char locked;
 	refcount_t usage;
 	union {
 		Task *owner;
@@ -39,15 +38,18 @@ struct ObjectType {
 
 /* Object */
 struct Object {
+	uint32_t magic;
 	ObjectType *type;
 	refcount_t usage;
 	Spinlock lock;
 };
+#define OBJECT_MAGIC 0x10032004
 
 void *get(void *addr);
 void put(void *addr);
 void *new(ObjectType *type);
 void *copy(void *addr);
+refcount_t usage(void *addr);
 void lock(void *addr);
 void unlock(void *addr);
 
@@ -59,8 +61,17 @@ 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);
 
+Iterator *iterate(ObjectList *list);
+void *first(Iterator *iter);
+void *last(Iterator *iter);
+void *next(Iterator *iter);
+void *prev(Iterator *iter);
+int done_iterating(Iterator *iter);
+#define foreach(l,i) for (Iterator *(__l_ ## i) = iterate(l); (__l_ ## i); \
+                          done_iterating(__l_ ## i), (__l_ ## i) = NULL) \
+                     for (i = first(__l_ ## i); i; i = next(__l_ ## i))
+
 #endif