#define MAX_PATH_LEN 32
#endif
-#ifndef MAX_WAITERS
-#define MAX_WAITERS 32
-#endif
+#define XSEG_NAMESIZE 256
+#define XSEG_TNAMESIZE 32
/* Peers and Segments
*
struct xseg;
struct xseg_port;
-#define MAGIC_OBJH 1
-#define MAGIC_REQ 2
-#define MAGIC_PORT 3
+#define XSEG_MAGIC (0xcafe0000)
+#define MAGIC_OBJH (XSEG_MAGIC | 1)
+#define MAGIC_REQ (XSEG_MAGIC | 2)
+#define MAGIC_PORT (XSEG_MAGIC | 3)
struct xseg_operations {
void (*mfree)(void *mem);
void (*unmap)(void *xseg, uint64_t size);
};
-#define XSEG_NAMESIZE 256
-#define XSEG_TNAMESIZE 32
-
struct xseg_type {
struct xseg_operations ops;
char name[XSEG_TNAMESIZE];
};
+
struct xseg_peer_operations {
- int (*local_signal_init)(void);
- void (*local_signal_quit)(void);
+ int (*init_signal_desc)(struct xseg *xseg, void *sd);
+ void (*quit_signal_desc)(struct xseg *xseg, void *sd);
+ void *(*alloc_data)(struct xseg *xseg);
+ void (*free_data)(struct xseg *xseg, void *data);
+ void *(*alloc_signal_desc)(struct xseg *xseg, void *data);
+ void (*free_signal_desc)(struct xseg *xseg, void *data, void *sd);
+ int (*local_signal_init)(struct xseg *xseg, xport portno);
+ void (*local_signal_quit)(struct xseg *xseg, xport portno);
int (*remote_signal_init)(void);
void (*remote_signal_quit)(void);
int (*signal_join)(struct xseg *xseg);
uint64_t max_alloc_reqs;
uint64_t alloc_reqs;
struct xlock port_lock;
- volatile uint64_t waitcue;
- struct xpool waiters;
- struct xpool_node bufs[MAX_WAITERS];
+ xptr signal_desc;
};
struct xseg_request;
#define XF_NOSYNC (1 << 0)
#define XF_FLUSH (1 << 1)
#define XF_FUA (1 << 2)
+#define XF_FORCE (1 << 3)
/* STATES */
#define XS_SERVED (1 << 0)
struct xseg_request {
xserial serial;
uint64_t offset;
- uint64_t size; /* FIXME: why are there both size and datalen fields? */
- /* FIXME: why does filed use ->datalen instead of ->size? */
+ uint64_t size;
uint64_t serviced;
xptr data;
uint64_t datalen;
struct xseg_shared {
uint64_t flags;
char (*peer_types)[XSEG_TNAMESIZE]; /* alignment? */
+ xptr *peer_type_data;
uint32_t nr_peer_types;
};
struct xseg_type segment_type;
struct xseg_peer peer_type;
struct xseg_peer **peer_types;
+ void **peer_type_data;
uint32_t max_peer_types;
void (*wakeup)(uint32_t portno);
xhash_t *req_data;
struct xseg_config * config );
struct xseg_port * xseg_bind_port ( struct xseg * xseg,
- uint32_t portno );
+ uint32_t portno,
+ void * sd );
static uint32_t xseg_portno ( struct xseg * xseg,
struct xseg_port * port );
uint32_t flags );
struct xseg_request * xseg_receive ( struct xseg * xseg,
- xport portno );
+ xport portno,
+ uint32_t flags );
/* \___________________/ \_________/ */
/* ___________________ _________ */
/* / \ / \ */
struct xseg_request * xseg_accept ( struct xseg * xseg,
- xport portno );
+ xport portno,
+ uint32_t flags );
xport xseg_respond ( struct xseg * xseg,
struct xseg_request * xreq,
return (char *) XPTR_TAKE(req->data, xseg->segment);
}
+static inline void * xseg_get_signal_desc(struct xseg *xseg, struct xseg_port *port)
+{
+ return (void *) XPTR_TAKE(port->signal_desc, xseg->segment);
+}
+
+struct xobject_h * xseg_get_objh(struct xseg *xseg, uint32_t magic, uint64_t size);
+void xseg_put_objh(struct xseg *xseg, struct xobject_h *objh);
+
#define xseg_get_queue(__xseg, __port, __queue) \
((struct xq *) XPTR_TAKE(__port->__queue, __xseg->segment))