86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
|
|
#ifndef SERVER_H
|
||
|
|
#define SERVER_H
|
||
|
|
|
||
|
|
#include "generic/typedef.h"
|
||
|
|
#include "system/task.h"
|
||
|
|
#include "spinlock.h"
|
||
|
|
#include "list.h"
|
||
|
|
|
||
|
|
|
||
|
|
#define REQ_COMPLETE_CALLBACK 0x01000000
|
||
|
|
#define REQ_WAIT_COMPLETE 0x02000000
|
||
|
|
#define REQ_HI_PRIORITY 0x04000000
|
||
|
|
|
||
|
|
|
||
|
|
#define REQ_TYPE_MASK 0x00ffffff
|
||
|
|
|
||
|
|
|
||
|
|
struct server_req {
|
||
|
|
int type;
|
||
|
|
int err;
|
||
|
|
void *server_priv;
|
||
|
|
struct list_head entry;
|
||
|
|
struct server *server;
|
||
|
|
void *user;
|
||
|
|
const char *owner;
|
||
|
|
OS_SEM sem;
|
||
|
|
union {
|
||
|
|
int state;
|
||
|
|
void (*func)(void *, void *, int);
|
||
|
|
} complete;
|
||
|
|
u32 arg[0];
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
struct server_info {
|
||
|
|
const char *name;
|
||
|
|
u16 reqlen;
|
||
|
|
u8 reqnum;
|
||
|
|
void *(*open)(void *, void *);
|
||
|
|
void (*close)(void *);
|
||
|
|
};
|
||
|
|
|
||
|
|
#define REQ_BUF_LEN 512
|
||
|
|
|
||
|
|
struct server {
|
||
|
|
bool avaliable;
|
||
|
|
void *server;
|
||
|
|
OS_SEM sem;
|
||
|
|
OS_MUTEX mutex;
|
||
|
|
spinlock_t lock;
|
||
|
|
struct list_head *req_buf;
|
||
|
|
struct list_head free;
|
||
|
|
struct list_head pending;
|
||
|
|
const struct server_info *info;
|
||
|
|
const char *owner;
|
||
|
|
void *handler_priv;
|
||
|
|
void (*event_handler)(void *, int argc, int *argv);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#define SERVER_REGISTER(info) \
|
||
|
|
const struct server_info info sec(.server_info)
|
||
|
|
|
||
|
|
|
||
|
|
#define server_load(server) \
|
||
|
|
load_module(server)
|
||
|
|
|
||
|
|
struct server *server_open(const char *name, void *arg);
|
||
|
|
|
||
|
|
void server_register_event_handler(struct server *server, void *priv,
|
||
|
|
void (*handler)(void *, int argc, int *argv));
|
||
|
|
|
||
|
|
void server_close(struct server *server);
|
||
|
|
|
||
|
|
int server_request(struct server *server, int req_type, void *arg);
|
||
|
|
|
||
|
|
int server_request_async(struct server *server, int req_type, void *arg, ...);
|
||
|
|
|
||
|
|
int server_req_complete(struct server_req *req);
|
||
|
|
|
||
|
|
int server_event_handler(void *_server, int argc, int *argv);
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|