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.
36 #include <xseg/xseg.h>
43 #define BEGIN_READ_ARGS(__ac, __av) \
45 char **__argv = __av; \
47 for (__i = 0; __i < __argc; __i++) {
49 #define END_READ_ARGS() \
52 #define READ_ARG_ULONG(__name, __var) \
53 if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){ \
54 __var = strtoul(__argv[__i+1], NULL, 10); \
59 #define READ_ARG_STRING(__name, __var, __max_len) \
60 if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){ \
61 strncpy(__var, __argv[__i+1], __max_len); \
62 __var[__max_len] = 0; \
67 #define READ_ARG_BOOL(__name, __var) \
68 if (!strcmp(__argv[__i], __name)){ \
76 /* main peer structs */
79 struct xseg_request *req;
94 struct peer_req *peer_reqs;
96 int (*peerd_loop)(void *arg);
100 struct thread *thread;
102 void (*interactive_func)(void);
106 enum dispatch_reason {
108 dispatch_receive = 1,
109 dispatch_internal = 2
112 void fail(struct peerd *peer, struct peer_req *pr);
113 void complete(struct peerd *peer, struct peer_req *pr);
114 int defer_request(struct peerd *peer, struct peer_req *pr);
115 void pending(struct peerd *peer, struct peer_req *req);
116 void log_pr(char *msg, struct peer_req *pr);
117 int canDefer(struct peerd *peer);
118 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
119 struct peer_req *alloc_peer_req(struct peerd *peer);
120 void free_peer_req(struct peerd *peer, struct peer_req *pr);
121 void get_submits_stats();
122 void get_responds_stats();
124 void print_req(struct xseg *xseg, struct xseg_request *req);
126 int check_ports(struct peerd *peer);
129 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
132 static inline struct peerd * __get_peerd(void * custom_peerd)
134 return (struct peerd *) ((unsigned long) custom_peerd - offsetof(struct peerd, priv));
139 /* decration of "common" variables */
140 extern volatile unsigned int terminated;
141 extern struct log_ctx lc;
146 inline int isTerminate(void)
151 /********************************
152 * mandatory peer functions *
153 ********************************/
155 /* peer main function */
156 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
157 void custom_peer_finalize(struct peerd *peer);
159 /* dispatch function */
160 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req,
161 enum dispatch_reason reason);
163 void custom_peer_usage();