From bac99c7b213712bbca2139139ec08498e141feba Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Fri, 20 Feb 2026 12:39:32 +0800 Subject: [PATCH] fuse_kern_chan: get rid of clangisms --- lib/fuse_kern_chan.c | 68 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git lib/fuse_kern_chan.c lib/fuse_kern_chan.c index 8ec6970..9cfbc26 100644 --- lib/fuse_kern_chan.c +++ lib/fuse_kern_chan.c @@ -24,12 +24,28 @@ #include #include #include +#include +#include struct _kern_data { dispatch_queue_t sendQ; dispatch_queue_t recvQ; }; +struct _recv_context { + struct fuse_chan **chp; + char *buf; + size_t size; + int result; +}; + +struct _send_context { + struct fuse_chan *ch; + const struct iovec *iov; + size_t count; + int result; +}; + static int _fuse_kern_chan_receive(struct fuse_chan **chp, char *buf, size_t size) { @@ -96,15 +112,26 @@ again: return total; } +static void _fuse_kern_chan_receive_f(void *context) +{ + struct _recv_context *ctx = (struct _recv_context *)context; + ctx->result = _fuse_kern_chan_receive(ctx->chp, ctx->buf, ctx->size); +} + static int fuse_kern_chan_receive(struct fuse_chan **chp, char *buf, size_t size) { // since we use a regular socket, need to make sure all requests are serialized - __block int res; + struct _recv_context ctx; struct _kern_data *data = (struct _kern_data *)fuse_chan_data(*chp); - dispatch_sync(data->recvQ, ^{ - res = _fuse_kern_chan_receive(chp, buf,size); - }); - return res; + + ctx.chp = chp; + ctx.buf = buf; + ctx.size = size; + ctx.result = 0; + + dispatch_sync_f(data->recvQ, &ctx, _fuse_kern_chan_receive_f); + + return ctx.result; } static int _fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov[], @@ -128,17 +155,27 @@ static int _fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov[], return 0; } +static void _fuse_kern_chan_send_f(void *context) +{ + struct _send_context *ctx = (struct _send_context *)context; + ctx->result = _fuse_kern_chan_send(ctx->ch, ctx->iov, ctx->count); +} + static int fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov[], size_t count) { // since we use a regular socket, need to make sure all requests are serialized - __block int res; + struct _send_context ctx; struct _kern_data *data = (struct _kern_data *)fuse_chan_data(ch); - dispatch_sync(data->sendQ, ^{ - res = _fuse_kern_chan_send(ch, iov, count); - }); - return res; + ctx.ch = ch; + ctx.iov = iov; + ctx.count = count; + ctx.result = 0; + + dispatch_sync_f(data->sendQ, &ctx, _fuse_kern_chan_send_f); + + return ctx.result; } static void fuse_kern_chan_destroy(struct fuse_chan *ch) @@ -153,8 +190,13 @@ static void fuse_kern_chan_destroy(struct fuse_chan *ch) } struct _kern_data *data = (struct _kern_data *)fuse_chan_data(ch); - if (data) + if (data) { + if (data->recvQ) + dispatch_release(data->recvQ); + if (data->sendQ) + dispatch_release(data->sendQ); free(data); + } } #ifdef __APPLE__ @@ -174,8 +216,8 @@ struct fuse_chan *fuse_kern_chan_new(int fd) bufsize = bufsize < MIN_BUFSIZE ? MIN_BUFSIZE : bufsize; struct _kern_data *data = (struct _kern_data *)malloc(sizeof(*data)); - data->recvQ = dispatch_queue_create("recvQ", DISPATCH_QUEUE_SERIAL); - data->sendQ = dispatch_queue_create("sendQ", DISPATCH_QUEUE_SERIAL); + data->recvQ = dispatch_queue_create("recvQ", NULL); + data->sendQ = dispatch_queue_create("sendQ", NULL); return fuse_chan_new(&op, fd, bufsize, data); }