Split peer request queues.
[archipelago] / xseg / peers / user / mpeer.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 #include <stddef.h>
36 #include <xseg/xseg.h>
37 /* main mpeer structs */
38 struct peer_req {
39         struct peerd *peer;
40         struct xseg_request *req;
41         ssize_t retval;
42         xport portno;
43         void *priv;
44 };
45
46 struct peerd {
47         struct xseg *xseg;
48         xport portno_start;
49         xport portno_end;
50         long nr_ops;
51         uint32_t defer_portno;
52         struct peer_req *peer_reqs;
53         struct xq free_reqs;
54         void *priv;
55         uint32_t nr_threads;
56         struct thread *thread;
57         struct xq threads;
58         void (*interactive_func)(void);
59 };
60
61 enum dispatch_reason {
62         dispatch_accept = 0,
63         dispatch_receive = 1,
64         dispatch_internal = 2
65 };
66
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();
79
80 static inline struct peerd * __get_peerd(void * custom_peerd)
81 {
82         return (struct peerd *) ((unsigned long) custom_peerd  - offsetof(struct peerd, priv));
83 }
84
85 /********************************
86  *   mandatory peer functions   *
87  ********************************/
88
89 /* peer main function */
90 int custom_peer_init(struct peerd *peer, int argc, char *argv[]);
91
92 /* dispatch function that cannot block
93  * defers blocking calls to helper threads
94  */
95 int dispatch(struct peerd *peer, struct peer_req *pr, struct xseg_request *xseg,
96                 enum dispatch_reason reason);
97
98 void usage();