19#ifndef _COPPERPLATE_CLUSTER_H
20#define _COPPERPLATE_CLUSTER_H
22#include <boilerplate/hash.h>
23#include <copperplate/syncobj.h>
25#ifdef CONFIG_XENO_PSHARED
33 struct hash_table table;
42 struct hash_table table;
48 struct syndictionary *d;
52 struct pvhashobj hobj;
56 struct pvhash_table table;
65const void *clusterobj_key(
const struct clusterobj *cobj)
67 return __memptr(__main_heap, cobj->hobj.key);
71size_t clusterobj_keylen(
const struct clusterobj *cobj)
73 return cobj->hobj.len;
77pid_t clusterobj_cnode(
const struct clusterobj *cobj)
83const void *pvclusterobj_key(
const struct pvclusterobj *cobj)
85 return cobj->hobj.key;
89size_t pvclusterobj_keylen(
const struct pvclusterobj *cobj)
91 return cobj->hobj.len;
95pid_t pvclusterobj_cnode(
const struct pvclusterobj *cobj)
103 struct pvhashobj hobj;
107 struct pvhash_table table;
115#define pvclusterobj clusterobj
116#define pvcluster cluster
117#define pvsyncluster syncluster
120const void *clusterobj_key(
const struct pvclusterobj *cobj)
122 return cobj->hobj.key;
126size_t clusterobj_keylen(
const struct pvclusterobj *cobj)
128 return cobj->hobj.len;
132pid_t clusterobj_cnode(
const struct pvclusterobj *cobj)
138const void *pvclusterobj_key(
const struct pvclusterobj *cobj)
140 return clusterobj_key(cobj);
144size_t pvclusterobj_keylen(
const struct pvclusterobj *cobj)
146 return clusterobj_keylen(cobj);
150pid_t pvclusterobj_cnode(
const struct pvclusterobj *cobj)
152 return clusterobj_cnode(cobj);
157struct syncluster_wait_struct {
159 dref_type(
char *) name_ref;
168int pvcluster_init(
struct pvcluster *c,
const char *name);
170void pvcluster_destroy(
struct pvcluster *c);
172int pvcluster_addobj(
struct pvcluster *c,
const char *name,
173 struct pvclusterobj *cobj);
175int pvcluster_addobj_dup(
struct pvcluster *c,
const char *name,
176 struct pvclusterobj *cobj);
178int pvcluster_delobj(
struct pvcluster *c,
179 struct pvclusterobj *cobj);
181struct pvclusterobj *pvcluster_findobj(
struct pvcluster *c,
184int pvcluster_walk(
struct pvcluster *c,
185 int (*walk)(
struct pvcluster *c,
186 struct pvclusterobj *cobj));
188int pvsyncluster_init(
struct pvsyncluster *sc,
const char *name);
190void pvsyncluster_destroy(
struct pvsyncluster *sc);
192int pvsyncluster_addobj(
struct pvsyncluster *sc,
const char *name,
193 struct pvclusterobj *cobj);
195int pvsyncluster_delobj(
struct pvsyncluster *sc,
196 struct pvclusterobj *cobj);
198int pvsyncluster_findobj(
struct pvsyncluster *sc,
200 const struct timespec *timeout,
201 struct pvclusterobj **cobjp) __must_check;
203#ifdef CONFIG_XENO_PSHARED
205int cluster_init(
struct cluster *c,
const char *name);
207int cluster_addobj(
struct cluster *c,
const char *name,
208 struct clusterobj *cobj);
210int cluster_addobj_dup(
struct cluster *c,
const char *name,
211 struct clusterobj *cobj);
213int cluster_delobj(
struct cluster *c,
214 struct clusterobj *cobj);
216struct clusterobj *cluster_findobj(
struct cluster *c,
219int cluster_walk(
struct cluster *c,
220 int (*walk)(
struct cluster *c,
221 struct clusterobj *cobj));
223int syncluster_init(
struct syncluster *sc,
const char *name);
225int syncluster_addobj(
struct syncluster *sc,
const char *name,
226 struct clusterobj *cobj);
228int syncluster_delobj(
struct syncluster *sc,
229 struct clusterobj *cobj);
231int syncluster_findobj(
struct syncluster *sc,
233 const struct timespec *timeout,
234 struct clusterobj **cobjp) __must_check;
238static inline int cluster_init(
struct cluster *c,
const char *name)
240 return pvcluster_init(c, name);
243static inline int cluster_addobj(
struct cluster *c,
const char *name,
244 struct clusterobj *cobj)
246 return pvcluster_addobj(c, name, cobj);
249static inline int cluster_addobj_dup(
struct cluster *c,
const char *name,
250 struct clusterobj *cobj)
252 return pvcluster_addobj_dup(c, name, cobj);
255static inline int cluster_delobj(
struct cluster *c,
256 struct clusterobj *cobj)
258 return pvcluster_delobj(c, cobj);
261static inline struct clusterobj *cluster_findobj(
struct cluster *c,
264 return pvcluster_findobj(c, name);
267static inline int cluster_walk(
struct cluster *c,
268 int (*walk)(
struct cluster *c,
269 struct clusterobj *cobj))
271 return pvcluster_walk(c, walk);
274static inline int syncluster_init(
struct syncluster *sc,
277 return pvsyncluster_init(sc, name);
280static inline int syncluster_addobj(
struct syncluster *sc,
282 struct clusterobj *cobj)
284 return pvsyncluster_addobj(sc, name, cobj);
287static inline int syncluster_delobj(
struct syncluster *sc,
288 struct clusterobj *cobj)
290 return pvsyncluster_delobj(sc, cobj);
293static inline __must_check
294int syncluster_findobj(
struct syncluster *sc,
296 const struct timespec *timeout,
297 struct clusterobj **cobjp)
299 return pvsyncluster_findobj(sc, name, timeout, cobjp);