diff options
Diffstat (limited to 'lib9p')
-rw-r--r-- | lib9p/include/lib9p/srv.h | 18 | ||||
-rw-r--r-- | lib9p/srv.c | 11 |
2 files changed, 16 insertions, 13 deletions
diff --git a/lib9p/include/lib9p/srv.h b/lib9p/include/lib9p/srv.h index 6a6fed0..55bcba0 100644 --- a/lib9p/include/lib9p/srv.h +++ b/lib9p/include/lib9p/srv.h @@ -2,28 +2,32 @@ #define _LIB9P_SRV_H_ #include <libcr/coroutine.h> +#include <libcr_ipc/rpc.h> #include <libcr_ipc/chan.h> #include <lib9p/9p.h> +CR_RPC_DECLARE(_lib9p_srv_reqch, struct lib9p_req *, bool) +CR_CHAN_DECLARE(_lib9p_srv_flushch, bool) + struct lib9p_srv_reqctx { struct lib9p_ctx *base; uint32_t uid; char *uname; - cr_chan_t(bool) _flushch; + _lib9p_srv_flushch_t _flushch; }; -static inline bool flush_requested(struct lib9p_srv_reqctx *ctx) { +static inline bool lib9p_srv_flush_requested(struct lib9p_srv_reqctx *ctx) { assert(ctx); - return cr_chan_can_send(&ctx->_flushch); + return _lib9p_srv_flushch_can_send(&ctx->_flushch); } -static inline int acknowledge_flush(struct lib9p_srv_reqctx *ctx) { +static inline int lib9p_srv_acknowledge_flush(struct lib9p_srv_reqctx *ctx) { assert(ctx); - assert(cr_chan_can_send(&ctx->_flushch)); + assert(_lib9p_srv_flushch_can_send(&ctx->_flushch)); lib9p_error(ctx->base, LINUX_ECANCELED, "request canceled by flush"); - cr_chan_send(&ctx->_flushch, (bool)true); + _lib9p_srv_flushch_send(&ctx->_flushch, true); return -1; } @@ -89,7 +93,7 @@ struct lib9p_srv { struct lib9p_srv_file (*rootdir)(struct lib9p_srv_reqctx *ctx, char *treename); /* For internal use */ - cr_chan_t(struct lib9p_req *) reqch; + _lib9p_srv_reqch_t _reqch; }; /** diff --git a/lib9p/srv.c b/lib9p/srv.c index 9bfe19e..478a642 100644 --- a/lib9p/srv.c +++ b/lib9p/srv.c @@ -190,8 +190,7 @@ COROUTINE lib9p_srv_read_cr(void *_srv) { goto close; /* Handle the message... in another coroutine. */ - cr_chan_send(&srv->reqch, &req); - cr_pause_and_yield(); /* wait for it to have copied req */ + _lib9p_srv_reqch_send_req(&srv->_reqch, &req); } close: netio_close(conn.fd, true, sess.reqs.len == 0); @@ -235,12 +234,12 @@ COROUTINE lib9p_srv_write_cr(void *_srv) { for (;;) { /* Receive the request from the reader coroutine. */ struct lib9p_req req; - struct lib9p_req *_req_p; - cr_chan_recv(&srv->reqch, &_req_p); - req = *_req_p; + _lib9p_srv_reqch_req_t req_handle; + req_handle = _lib9p_srv_reqch_recv_req(&srv->_reqch); + req = *req_handle.req; memcpy(net, req.net_bytes, decode_u32le(req.net_bytes)); req.net_bytes = net; - cr_unpause(req.parent_sess->parent_conn->reader); /* notify that we've copied req */ + _lib9p_srv_reqch_send_resp(req_handle, 0); /* notify that we've copied req */ handle_Tmessage(&req); |