make mapper use macros for reading arguments. also check than arguments were provided
[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
9 #define BEGIN_READ_ARGS(__ac, __av)                                     \
10         int __argc = __ac;                                              \
11         char **__argv = __av;                                           \
12         int __i;                                                        \
13         for (__i = 0; __i < __argc; __i++) {
14
15 #define END_READ_ARGS()                                                 \
16         }
17
18 #define READ_ARG_ULONG(__name, __var)                                   \
19         if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){  \
20                 __var = strtoul(__argv[__i+1], NULL, 10);               \
21                 __i += 1;                                               \
22                 continue;                                               \
23         }
24
25 #define READ_ARG_STRING(__name, __var, __max_len)                       \
26         if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){  \
27                 strncpy(__var, __argv[__i+1], __max_len);               \
28                 __var[__max_len] = 0;                           \
29                 __i += 1;                                               \
30                 continue;                                               \
31         }
32
33 #define READ_ARG_BOOL(__name, __var)                                    \
34         if (!strcmp(__argv[__i], __name)){                              \
35                 __var = 1;                                              \
36                 continue;                                               \
37         }
38
39
40
41
42 /* main peer structs */
43 struct peer_req {
44         struct peerd *peer;
45         struct xseg_request *req;
46         ssize_t retval;
47         xport portno;
48         void *priv;
49 #ifdef ST_THREADS
50         st_cond_t cond;
51 #endif
52 };
53
54 struct peerd {
55         struct xseg *xseg;
56         xport portno_start;
57         xport portno_end;
58         long nr_ops;
59         uint32_t defer_portno;
60         struct peer_req *peer_reqs;
61         struct xq free_reqs;
62         void *priv;
63 #ifdef MT
64         uint32_t nr_threads;
65         struct thread *thread;
66         struct xq threads;
67         void (*interactive_func)(void);
68 #endif
69 };
70
71 enum dispatch_reason {
72         dispatch_accept = 0,
73         dispatch_receive = 1,
74         dispatch_internal = 2
75 };
76
77 void fail(struct peerd *peer, struct peer_req *pr);
78 void complete(struct peerd *peer, struct peer_req *pr);
79 void defer_request(struct peerd *peer, struct peer_req *pr);
80 void pending(struct peerd *peer, struct peer_req *req);
81 void log_pr(char *msg, struct peer_req *pr);
82 int canDefer(struct peerd *peer);
83 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
84 struct peer_req *alloc_peer_req(struct peerd *peer);
85 void free_peer_req(struct peerd *peer, struct peer_req *pr);
86 void get_submits_stats();
87 void get_responds_stats();
88 void usage();
89
90 #ifdef MT
91 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
92 #endif
93
94 static inline struct peerd * __get_peerd(void * custom_peerd)
95 {
96         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
97 }
98
99
100 /* decration of "common" variables */
101 extern struct log_ctx lc;
102 #ifdef ST_THREADS
103 extern uint32_t ta;
104 #endif
105
106
107 /********************************
108  *   mandatory peer functions   *
109  ********************************/
110
111 /* peer main function */
112 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
113 void custom_peer_finalize(struct peerd *peer);
114
115 /* dispatch function */
116 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
117                 enum dispatch_reason reason);
118
119 void custom_peer_usage();