bench: Fix minor validation issue
[archipelago] / xseg / peers / user / peer.h
1 /*
2  * Copyright 2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *   2. Redistributions in binary form must reproduce the above
12  *      copyright notice, this list of conditions and the following
13  *      disclaimer in the documentation and/or other materials
14  *      provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * The views and conclusions contained in the software and
30  * documentation are those of the authors and should not be
31  * interpreted as representing official policies, either expressed
32  * or implied, of GRNET S.A.
33  */
34
35 #ifndef PEER_H
36
37 #define PEER_H
38
39 #include <stddef.h>
40 #include <xseg/xseg.h>
41
42 #ifdef ST_THREADS
43 #include <st.h>
44 #endif
45
46
47 #define BEGIN_READ_ARGS(__ac, __av)                                     \
48         int __argc = __ac;                                              \
49         char **__argv = __av;                                           \
50         int __i;                                                        \
51         for (__i = 0; __i < __argc; __i++) {
52
53 #define END_READ_ARGS()                                                 \
54         }
55
56 #define READ_ARG_ULONG(__name, __var)                                   \
57         if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){  \
58                 __var = strtoul(__argv[__i+1], NULL, 10);               \
59                 __i += 1;                                               \
60                 continue;                                               \
61         }
62
63 #define READ_ARG_STRING(__name, __var, __max_len)                       \
64         if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){  \
65                 strncpy(__var, __argv[__i+1], __max_len);               \
66                 __var[__max_len] = 0;                           \
67                 __i += 1;                                               \
68                 continue;                                               \
69         }
70
71 #define READ_ARG_BOOL(__name, __var)                                    \
72         if (!strcmp(__argv[__i], __name)){                              \
73                 __var = 1;                                              \
74                 continue;                                               \
75         }
76
77
78
79
80 /* main peer structs */
81 struct peer_req {
82         struct peerd *peer;
83         struct xseg_request *req;
84         ssize_t retval;
85         xport portno;
86         void *priv;
87 #ifdef ST_THREADS
88         st_cond_t cond;
89 #endif
90 #ifdef MT
91         int thread_no;
92 #endif
93 };
94
95 struct thread {
96         pthread_t tid;
97         struct peerd *peer;
98         int thread_no;
99         struct xq free_thread_reqs;
100         void *priv;
101         void *arg;
102 };
103
104 struct peerd {
105         struct xseg *xseg;
106         xport portno_start;
107         xport portno_end;
108         long nr_ops;
109         xport defer_portno;
110         struct peer_req *peer_reqs;
111         struct xq free_reqs;
112         int (*peerd_loop)(void *arg);
113         void *priv;
114 #ifdef MT
115         uint32_t nr_threads;
116         struct thread *thread;
117         struct xq threads;
118         void (*interactive_func)(void);
119 #else
120 #endif
121 };
122
123 enum dispatch_reason {
124         dispatch_accept = 0,
125         dispatch_receive = 1,
126         dispatch_internal = 2
127 };
128
129 void fail(struct peerd *peer, struct peer_req *pr);
130 void complete(struct peerd *peer, struct peer_req *pr);
131 int defer_request(struct peerd *peer, struct peer_req *pr);
132 void pending(struct peerd *peer, struct peer_req *req);
133 void log_pr(char *msg, struct peer_req *pr);
134 int canDefer(struct peerd *peer);
135 void free_peer_req(struct peerd *peer, struct peer_req *pr);
136 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
137 void get_submits_stats();
138 void get_responds_stats();
139 void usage();
140 void print_req(struct xseg *xseg, struct xseg_request *req);
141 int all_peer_reqs_free(struct peerd *peer);
142
143 #ifdef MT
144 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
145 struct peer_req *alloc_peer_req(struct peerd *peer, struct thread *t);
146 int check_ports(struct peerd *peer, struct thread *t);
147 #else
148 struct peer_req *alloc_peer_req(struct peerd *peer);
149 int check_ports(struct peerd *peer);
150 #endif
151
152 static inline struct peerd * __get_peerd(void * custom_peerd)
153 {
154         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
155 }
156
157
158
159 /* decration of "common" variables */
160 extern volatile unsigned int terminated;
161 extern struct log_ctx lc;
162 #ifdef ST_THREADS
163 extern uint32_t ta;
164 #endif
165
166 inline int isTerminate(void)
167 {
168         return terminated;
169 }
170
171 /********************************
172  *   mandatory peer functions   *
173  ********************************/
174
175 /* peer main function */
176 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
177 void custom_peer_finalize(struct peerd *peer);
178
179 /* dispatch function */
180 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
181                 enum dispatch_reason reason);
182
183 void custom_peer_usage();
184
185 #endif /* end of PEER_H */