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>
37 /* main mpeer structs */
40 struct xseg_request *req;
51 uint32_t defer_portno;
52 struct peer_req *peer_reqs;
56 struct thread *thread;
58 void (*interactive_func)(void);
61 enum dispatch_reason {
67 void fail(struct peerd *peer, struct peer_req *pr);
68 void complete(struct peerd *peer, struct peer_req *pr);
69 void defer_request(struct peerd *peer, struct peer_req *pr);
70 void pending(struct peerd *peer, struct peer_req *req);
71 void log_pr(char *msg, struct peer_req *pr);
72 int canDefer(struct peerd *peer);
73 int submit_peer_req(struct peerd *peer, struct peer_req *pr);
74 struct peer_req *alloc_peer_req(struct peerd *peer);
75 void free_peer_req(struct peerd *peer, struct peer_req *pr);
76 int thread_execute(struct peerd *peer, void (*func)(void *arg), void *arg);
77 void get_submits_stats();
78 void get_responds_stats();
80 static inline struct peerd * __get_peerd(void * custom_peerd)
82 return (struct peerd *) ((unsigned long) custom_peerd - offsetof(struct peerd, priv));
85 /********************************
86 * mandatory peer functions *
87 ********************************/
89 /* peer main function */
90 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
92 /* dispatch function that cannot block
93 * defers blocking calls to helper threads
95 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *xseg,
96 enum dispatch_reason reason);