summaryrefslogblamecommitdiff
path: root/src/include/gc/server.h
blob: b98b4fb979292c3e72097384db9cf64dff383d70 (plain) (tree)














































































                                                                                                                                 
#ifndef DEF_SERVER_H
#define DEF_SERVER_H

#include "syscall.h"
#include "obj.h"

//parameter/return values types
#define PT_VOID 0
#define PT_OBJDESC 1
#define PT_LONG 2
#define PT_LONGLONG 3		//for return values
#define PT_SHM 3	

struct method_data {
	struct {
		union {
			int i;
			void* p;
		} val;
		int type;
		int keepShm;		//for messages : keep shared memory segment after return or unmap ? (default : 0 = unmap)
	} parameters[3];
	uint32_t func;
	int blocking;	//1 : blocking request, 0 : message
	struct object_srv *obj;
};

struct method_ret {
	union {
		int i;
		int64_t l;
	};
	int type;
	int status;	//= error code if any
};

//helper function for creating return values
struct method_ret mr_long(int val);
struct method_ret mr_llong(int64_t val);
struct method_ret mr_obj(Object* obj);
struct method_ret mr_srv(struct object_srv* obj);
struct method_ret mr_void();
struct method_ret mr_err(int error);

typedef struct method_ret (*method_handler)(struct method_data*);

struct method_srv {
	uint32_t id;
	method_handler h;

	struct method_srv *next;
};

struct object_srv {
	int id;	//descriptor
	struct method_srv *methods;

	void *data;

	struct object_srv *next;
};

typedef struct object_srv Server;

extern Server procServer;	//corresponds to descriptor 0.

//possible actions for srv_handle
#define HA_ONCE 1	//check if requests are waiting, if so handle them
#define HA_WAIT 2	//check if requests are waiting, if so handle them, else wait for one to come and handle it
#define HA_LOOP 3	//wait for requests to come, handling them in an infinite loop

void srv_handleAll();	//check all objects once
void srv_handle(Server* o, int act);

Server *srv_create();
void srv_delete(Server *o);
void srv_addHandler(Server* o, uint32_t method, method_handler h);

#endif