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