merge peers skeletons
[archipelago] / xseg / peers / user / mpeer.h
1 #include <stddef.h>
2 #include <xseg/xseg.h>
3 /* main mpeer structs */
4 struct peer_req {
5         struct peerd *peer;
6         struct xseg_request *req;
7         ssize_t retval;
8         xport portno;
9         void *priv;
10 };
11
12 struct peerd {
13         struct xseg *xseg;
14         xport portno_start;
15         xport portno_end;
16         long nr_ops;
17         uint32_t defer_portno;
18         struct peer_req *peer_reqs;
19         struct xq free_reqs;
20         void *priv;
21         uint32_t nr_threads;
22         struct thread *thread;
23         struct xq threads;
24         void (*interactive_func)(void);
25 };
26
27 enum dispatch_reason {
28         dispatch_accept = 0,
29         dispatch_receive = 1,
30         dispatch_internal = 2
31 };
32
33 void fail(struct peerd *peer, struct peer_req *pr);
34 void complete(struct peerd *peer, struct peer_req *pr);
35 void defer_request(struct peerd *peer, struct peer_req *pr);
36 void pending(struct peerd *peer, struct peer_req *req);
37 void log_pr(char *msg, struct peer_req *pr);
38 int canDefer(struct peerd *peer);
39 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
40 struct peer_req *alloc_peer_req(struct peerd *peer);
41 void free_peer_req(struct peerd *peer, struct peer_req *pr);
42 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
43 void get_submits_stats();
44 void get_responds_stats();
45
46 static inline struct peerd * __get_peerd(void * custom_peerd)
47 {
48         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
49 }
50
51 /********************************
52  *   mandatory peer functions   *
53  ********************************/
54
55 /* peer main function */
56 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
57
58 /* dispatch function that cannot block
59  * defers blocking calls to helper threads
60  */
61 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *xseg,
62                 enum dispatch_reason reason);
63
64 void usage();