add aio_copy reference code in mt-sosd for future use
[archipelago] / xseg / peers / user / peer.h
1 #include <stddef.h>
2 #include <xseg/xseg.h>
3
4 #ifdef ST_THREADS
5 #include <st.h>
6 #endif
7
8 /* main peer structs */
9 struct peer_req {
10         struct peerd *peer;
11         struct xseg_request *req;
12         ssize_t retval;
13         xport portno;
14         void *priv;
15 #ifdef ST_THREADS
16         st_cond_t cond;
17 #endif
18 };
19
20 struct peerd {
21         struct xseg *xseg;
22         xport portno_start;
23         xport portno_end;
24         long nr_ops;
25         uint32_t defer_portno;
26         struct peer_req *peer_reqs;
27         struct xq free_reqs;
28         void *priv;
29 #ifdef MT
30         uint32_t nr_threads;
31         struct thread *thread;
32         struct xq threads;
33         void (*interactive_func)(void);
34 #endif
35 };
36
37 enum dispatch_reason {
38         dispatch_accept = 0,
39         dispatch_receive = 1,
40         dispatch_internal = 2
41 };
42
43 void fail(struct peerd *peer, struct peer_req *pr);
44 void complete(struct peerd *peer, struct peer_req *pr);
45 void defer_request(struct peerd *peer, struct peer_req *pr);
46 void pending(struct peerd *peer, struct peer_req *req);
47 void log_pr(char *msg, struct peer_req *pr);
48 int canDefer(struct peerd *peer);
49 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
50 struct peer_req *alloc_peer_req(struct peerd *peer);
51 void free_peer_req(struct peerd *peer, struct peer_req *pr);
52 void get_submits_stats();
53 void get_responds_stats();
54
55 #ifdef MT
56 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
57 #endif
58
59 static inline struct peerd * __get_peerd(void * custom_peerd)
60 {
61         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
62 }
63
64
65 /* decration of "common" variables */
66 extern struct log_ctx lc;
67 #ifdef ST_THREADS
68 extern uint32_t ta;
69 #endif
70
71
72 /********************************
73  *   mandatory peer functions   *
74  ********************************/
75
76 /* peer main function */
77 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
78
79 /* dispatch function */
80 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
81                 enum dispatch_reason reason);
82
83 void usage();