Bump version to 0.3.5next
[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         uint64_t threshold;
110         xport defer_portno;
111         struct peer_req *peer_reqs;
112         struct xq free_reqs;
113         int (*peerd_loop)(void *arg);
114         void *sd;
115         void *priv;
116 #ifdef MT
117         uint32_t nr_threads;
118         struct thread *thread;
119         struct xq threads;
120         void (*interactive_func)(void);
121 #else
122 #endif
123 };
124
125 enum dispatch_reason {
126         dispatch_accept = 0,
127         dispatch_receive = 1,
128         dispatch_internal = 2
129 };
130
131 void fail(struct peerd *peer, struct peer_req *pr);
132 void complete(struct peerd *peer, struct peer_req *pr);
133 int defer_request(struct peerd *peer, struct peer_req *pr);
134 void pending(struct peerd *peer, struct peer_req *req);
135 void log_pr(char *msg, struct peer_req *pr);
136 int canDefer(struct peerd *peer);
137 void free_peer_req(struct peerd *peer, struct peer_req *pr);
138 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
139 void get_submits_stats();
140 void get_responds_stats();
141 void usage();
142 void print_req(struct xseg *xseg, struct xseg_request *req);
143 int all_peer_reqs_free(struct peerd *peer);
144
145 #ifdef MT
146 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
147 struct peer_req *alloc_peer_req(struct peerd *peer, struct thread *t);
148 int check_ports(struct peerd *peer, struct thread *t);
149 #else
150 struct peer_req *alloc_peer_req(struct peerd *peer);
151 int check_ports(struct peerd *peer);
152 #endif
153
154 static inline struct peerd * __get_peerd(void * custom_peerd)
155 {
156         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
157 }
158
159
160
161 /* decration of "common" variables */
162 extern volatile unsigned int terminated;
163 extern struct log_ctx lc;
164 #ifdef ST_THREADS
165 extern uint32_t ta;
166 #endif
167
168 inline int isTerminate(void)
169 {
170         return terminated;
171 }
172
173 /********************************
174  *   mandatory peer functions   *
175  ********************************/
176
177 /* peer main function */
178 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
179 void custom_peer_finalize(struct peerd *peer);
180
181 /* dispatch function */
182 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
183                 enum dispatch_reason reason);
184
185 void custom_peer_usage();
186
187 #endif /* end of PEER_H */