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