BarryServer : Git

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

// Related

Nucleus

Barry Doubly-linked object lists and copying 7a0d3ef (3 years, 3 months ago)
#ifndef _NUCLEUS_OBJECT_H
#define _NUCLEUS_OBJECT_H

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

typedef struct Spinlock Spinlock;
typedef struct ObjectType ObjectType;
typedef struct Object Object;
typedef struct ObjectList ObjectList;

typedef struct Task Task;

typedef int (*iterate_callback_t)(void *object, void *data);

/* Spinlock */
struct Spinlock {
	char locked;
	refcount_t usage;
	union {
		Task *owner;
		cpu_t cpu;
	};
};

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

/* Object */
struct Object {
	ObjectType *type;
	refcount_t usage;
	Spinlock lock;
};

void *get(void *addr);
void put(void *addr);
void *new(ObjectType *type);
void *copy(void *addr);
void lock(void *addr);
void unlock(void *addr);

ObjectList *create_list(ObjectType *type);
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 iterate(ObjectList *list, iterate_callback_t callback, void *data);
ObjectList *copy_list(ObjectList *list);

#endif