2 * Copyright 2012 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
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.
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.
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.
40 #include <xseg/xseg.h>
47 #define BEGIN_READ_ARGS(__ac, __av) \
49 char **__argv = __av; \
51 for (__i = 0; __i < __argc; __i++) {
53 #define END_READ_ARGS() \
56 #define READ_ARG_ULONG(__name, __var) \
57 if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){ \
58 __var = strtoul(__argv[__i+1], NULL, 10); \
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; \
71 #define READ_ARG_BOOL(__name, __var) \
72 if (!strcmp(__argv[__i], __name)){ \
80 /* main peer structs */
83 struct xseg_request *req;
99 struct xq free_thread_reqs;
111 struct peer_req *peer_reqs;
113 int (*peerd_loop)(void *arg);
118 struct thread *thread;
120 void (*interactive_func)(void);
125 enum dispatch_reason {
127 dispatch_receive = 1,
128 dispatch_internal = 2
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();
142 void print_req(struct xseg *xseg, struct xseg_request *req);
143 int all_peer_reqs_free(struct peerd *peer);
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);
150 struct peer_req *alloc_peer_req(struct peerd *peer);
151 int check_ports(struct peerd *peer);
154 static inline struct peerd * __get_peerd(void * custom_peerd)
156 return (struct peerd *) ((unsigned long) custom_peerd - offsetof(struct peerd, priv));
161 /* decration of "common" variables */
162 extern volatile unsigned int terminated;
163 extern struct log_ctx lc;
168 inline int isTerminate(void)
173 /********************************
174 * mandatory peer functions *
175 ********************************/
177 /* peer main function */
178 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
179 void custom_peer_finalize(struct peerd *peer);
181 /* dispatch function */
182 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
183 enum dispatch_reason reason);
185 void custom_peer_usage();
187 #endif /* end of PEER_H */