root / xseg / peers / user / peer.h @ de4c09bb
History | View | Annotate | Download (4.4 kB)
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 |
#include <stddef.h> |
36 |
#include <xseg/xseg.h> |
37 |
|
38 |
#ifdef ST_THREADS
|
39 |
#include <st.h> |
40 |
#endif
|
41 |
|
42 |
|
43 |
#define BEGIN_READ_ARGS(__ac, __av) \
|
44 |
int __argc = __ac; \
|
45 |
char **__argv = __av; \
|
46 |
int __i; \
|
47 |
for (__i = 0; __i < __argc; __i++) { |
48 |
|
49 |
#define END_READ_ARGS() \
|
50 |
} |
51 |
|
52 |
#define READ_ARG_ULONG(__name, __var) \
|
53 |
if (!strcmp(__argv[__i], __name) && __i + 1 < __argc){ \ |
54 |
__var = strtoul(__argv[__i+1], NULL, 10); \ |
55 |
__i += 1; \
|
56 |
continue; \
|
57 |
} |
58 |
|
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; \
|
63 |
__i += 1; \
|
64 |
continue; \
|
65 |
} |
66 |
|
67 |
#define READ_ARG_BOOL(__name, __var) \
|
68 |
if (!strcmp(__argv[__i], __name)){ \
|
69 |
__var = 1; \
|
70 |
continue; \
|
71 |
} |
72 |
|
73 |
|
74 |
|
75 |
|
76 |
/* main peer structs */
|
77 |
struct peer_req {
|
78 |
struct peerd *peer;
|
79 |
struct xseg_request *req;
|
80 |
ssize_t retval; |
81 |
xport portno; |
82 |
void *priv;
|
83 |
#ifdef ST_THREADS
|
84 |
st_cond_t cond; |
85 |
#endif
|
86 |
}; |
87 |
|
88 |
struct peerd {
|
89 |
struct xseg *xseg;
|
90 |
xport portno_start; |
91 |
xport portno_end; |
92 |
long nr_ops;
|
93 |
xport defer_portno; |
94 |
struct peer_req *peer_reqs;
|
95 |
struct xq free_reqs;
|
96 |
int (*peerd_loop)(void *arg); |
97 |
void *priv;
|
98 |
#ifdef MT
|
99 |
uint32_t nr_threads; |
100 |
struct thread *thread;
|
101 |
struct xq threads;
|
102 |
void (*interactive_func)(void); |
103 |
#endif
|
104 |
}; |
105 |
|
106 |
enum dispatch_reason {
|
107 |
dispatch_accept = 0,
|
108 |
dispatch_receive = 1,
|
109 |
dispatch_internal = 2
|
110 |
}; |
111 |
|
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();
|
123 |
void usage();
|
124 |
void print_req(struct xseg *xseg, struct xseg_request *req); |
125 |
int isTerminate();
|
126 |
int check_ports(struct peerd *peer); |
127 |
|
128 |
#ifdef MT
|
129 |
int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg); |
130 |
#endif
|
131 |
|
132 |
static inline struct peerd * __get_peerd(void * custom_peerd) |
133 |
{ |
134 |
return (struct peerd *) ((unsigned long) custom_peerd - offsetof(struct peerd, priv)); |
135 |
} |
136 |
|
137 |
|
138 |
|
139 |
/* decration of "common" variables */
|
140 |
extern volatile unsigned int terminated; |
141 |
extern struct log_ctx lc; |
142 |
#ifdef ST_THREADS
|
143 |
extern uint32_t ta;
|
144 |
#endif
|
145 |
|
146 |
inline int isTerminate(void) |
147 |
{ |
148 |
return terminated;
|
149 |
} |
150 |
|
151 |
/********************************
|
152 |
* mandatory peer functions *
|
153 |
********************************/
|
154 |
|
155 |
/* peer main function */
|
156 |
int custom_peer_init(struct peerd *peer, int argc, char *argv[]); |
157 |
void custom_peer_finalize(struct peerd *peer); |
158 |
|
159 |
/* dispatch function */
|
160 |
int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *req, |
161 |
enum dispatch_reason reason);
|
162 |
|
163 |
void custom_peer_usage();
|