Loading aio-posix.c +2 −1 Original line number Diff line number Diff line Loading @@ -261,7 +261,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill pollfds */ QLIST_FOREACH(node, &ctx->aio_handlers, node) { if (!node->deleted && node->pfd.events) { if (!node->deleted && node->pfd.events && aio_node_check(ctx, node->is_external)) { add_pollfd(node); } } Loading aio-win32.c +2 −1 Original line number Diff line number Diff line Loading @@ -309,7 +309,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill fd sets */ count = 0; QLIST_FOREACH(node, &ctx->aio_handlers, node) { if (!node->deleted && node->io_notify) { if (!node->deleted && node->io_notify && aio_node_check(ctx, node->is_external)) { events[count++] = event_notifier_get_handle(node->e); } } Loading include/block/aio.h +38 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,8 @@ struct AioContext { /* TimerLists for calling timers - one per clock type */ QEMUTimerListGroup tlg; int external_disable_cnt; }; /** Loading Loading @@ -375,4 +377,40 @@ static inline void aio_timer_init(AioContext *ctx, */ int64_t aio_compute_timeout(AioContext *ctx); /** * aio_disable_external: * @ctx: the aio context * * Disable the further processing of external clients. */ static inline void aio_disable_external(AioContext *ctx) { atomic_inc(&ctx->external_disable_cnt); } /** * aio_enable_external: * @ctx: the aio context * * Enable the processing of external clients. */ static inline void aio_enable_external(AioContext *ctx) { assert(ctx->external_disable_cnt > 0); atomic_dec(&ctx->external_disable_cnt); } /** * aio_node_check: * @ctx: the aio context * @is_external: Whether or not the checked node is an external event source. * * Check if the node's is_external flag is okay to be polled by the ctx at this * moment. True means green light. */ static inline bool aio_node_check(AioContext *ctx, bool is_external) { return !is_external || !atomic_read(&ctx->external_disable_cnt); } #endif Loading
aio-posix.c +2 −1 Original line number Diff line number Diff line Loading @@ -261,7 +261,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill pollfds */ QLIST_FOREACH(node, &ctx->aio_handlers, node) { if (!node->deleted && node->pfd.events) { if (!node->deleted && node->pfd.events && aio_node_check(ctx, node->is_external)) { add_pollfd(node); } } Loading
aio-win32.c +2 −1 Original line number Diff line number Diff line Loading @@ -309,7 +309,8 @@ bool aio_poll(AioContext *ctx, bool blocking) /* fill fd sets */ count = 0; QLIST_FOREACH(node, &ctx->aio_handlers, node) { if (!node->deleted && node->io_notify) { if (!node->deleted && node->io_notify && aio_node_check(ctx, node->is_external)) { events[count++] = event_notifier_get_handle(node->e); } } Loading
include/block/aio.h +38 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,8 @@ struct AioContext { /* TimerLists for calling timers - one per clock type */ QEMUTimerListGroup tlg; int external_disable_cnt; }; /** Loading Loading @@ -375,4 +377,40 @@ static inline void aio_timer_init(AioContext *ctx, */ int64_t aio_compute_timeout(AioContext *ctx); /** * aio_disable_external: * @ctx: the aio context * * Disable the further processing of external clients. */ static inline void aio_disable_external(AioContext *ctx) { atomic_inc(&ctx->external_disable_cnt); } /** * aio_enable_external: * @ctx: the aio context * * Enable the processing of external clients. */ static inline void aio_enable_external(AioContext *ctx) { assert(ctx->external_disable_cnt > 0); atomic_dec(&ctx->external_disable_cnt); } /** * aio_node_check: * @ctx: the aio context * @is_external: Whether or not the checked node is an external event source. * * Check if the node's is_external flag is okay to be polled by the ctx at this * moment. True means green light. */ static inline bool aio_node_check(AioContext *ctx, bool is_external) { return !is_external || !atomic_read(&ctx->external_disable_cnt); } #endif