BarryServer : Git

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

// Related

Nucleus

Barry Preemptive and lockless scheduler a1eaf26 (3 years, 1 month ago)
#ifndef _NUCLEUS_OBJECT_H
#define _NUCLEUS_OBJECT_H

#include <stddef.h>
#include <sys/types.h>
#include <nucleus/cpu.h>
#include <nucleus/types.h>

typedef struct Spinlock Spinlock;
typedef struct ObjectType ObjectType;
typedef struct Object Object;
typedef struct ObjectList ObjectList;
typedef struct Iterator Iterator;
typedef int (*compare_callback_t)(void *, void *);

/* Spinlock */
struct Spinlock {
	_Atomic int locked;
	refcount_t usage;
	Task *owner;
};

/* Object Type */
struct ObjectType {
	refcount_t usage;
	const char *name;
	size_t size;
	ObjectList *objects;
	void *(*alloc)(void);
	void (*free)(Object *);
	void (*new)(Object *);
	void (*delete)(Object *);
	void (*copy)(Object *, Object *);
};

/* Object */
struct Object {
	uint32_t magic;
	ObjectType *type;
	refcount_t usage;
	Spinlock lock;
};
#define OBJECT_MAGIC 0x10032004

/* Object List modes */
enum ListMode {
	LIST_NORMAL,
	LIST_ORDERED,
	LIST_LOCKLESS,
};

int check(void *addr);
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);
#define swap_ref(v,o) ({ if (o) get(o); if (v) put(v); v = o; })

ObjectList *create_list(ObjectType *type, enum ListMode mode, ...);
void destroy_list(ObjectList *list);
void add(ObjectList *list, void *addr);
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);
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