aio: tweak walking in dispatch phase
Preparing for the following patch, use QLIST_FOREACH_SAFE and modify the placement of walking_handlers increment/decrement. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 20170112180800.21085-7-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									56d2c3c60d
								
							
						
					
					
						commit
						abf90d3921
					
				
							
								
								
									
										28
									
								
								aio-posix.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								aio-posix.c
									
									
									
									
									
								
							@ -369,20 +369,18 @@ bool aio_pending(AioContext *ctx)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static bool aio_dispatch_handlers(AioContext *ctx)
 | 
					static bool aio_dispatch_handlers(AioContext *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AioHandler *node;
 | 
					    AioHandler *node, *tmp;
 | 
				
			||||||
    bool progress = false;
 | 
					    bool progress = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * We have to walk very carefully in case aio_set_fd_handler is
 | 
					     * We have to walk very carefully in case aio_set_fd_handler is
 | 
				
			||||||
     * called while we're walking.
 | 
					     * called while we're walking.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    node = QLIST_FIRST(&ctx->aio_handlers);
 | 
					 | 
				
			||||||
    while (node) {
 | 
					 | 
				
			||||||
        AioHandler *tmp;
 | 
					 | 
				
			||||||
        int revents;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ctx->walking_handlers++;
 | 
					    ctx->walking_handlers++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QLIST_FOREACH_SAFE(node, &ctx->aio_handlers, node, tmp) {
 | 
				
			||||||
 | 
					        int revents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        revents = node->pfd.revents & node->pfd.events;
 | 
					        revents = node->pfd.revents & node->pfd.events;
 | 
				
			||||||
        node->pfd.revents = 0;
 | 
					        node->pfd.revents = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -405,17 +403,17 @@ static bool aio_dispatch_handlers(AioContext *ctx)
 | 
				
			|||||||
            progress = true;
 | 
					            progress = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tmp = node;
 | 
					        if (node->deleted) {
 | 
				
			||||||
        node = QLIST_NEXT(node, node);
 | 
					            ctx->walking_handlers--;
 | 
				
			||||||
 | 
					            if (!ctx->walking_handlers) {
 | 
				
			||||||
 | 
					                QLIST_REMOVE(node, node);
 | 
				
			||||||
 | 
					                g_free(node);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ctx->walking_handlers++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ctx->walking_handlers--;
 | 
					    ctx->walking_handlers--;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!ctx->walking_handlers && tmp->deleted) {
 | 
					 | 
				
			||||||
            QLIST_REMOVE(tmp, node);
 | 
					 | 
				
			||||||
            g_free(tmp);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return progress;
 | 
					    return progress;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								aio-win32.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								aio-win32.c
									
									
									
									
									
								
							@ -227,20 +227,18 @@ bool aio_pending(AioContext *ctx)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static bool aio_dispatch_handlers(AioContext *ctx, HANDLE event)
 | 
					static bool aio_dispatch_handlers(AioContext *ctx, HANDLE event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    AioHandler *node;
 | 
					    AioHandler *node, *tmp;
 | 
				
			||||||
    bool progress = false;
 | 
					    bool progress = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ctx->walking_handlers++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * We have to walk very carefully in case aio_set_fd_handler is
 | 
					     * We have to walk very carefully in case aio_set_fd_handler is
 | 
				
			||||||
     * called while we're walking.
 | 
					     * called while we're walking.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    node = QLIST_FIRST(&ctx->aio_handlers);
 | 
					    QLIST_FOREACH_SAFE(node, &ctx->aio_handlers, node, tmp) {
 | 
				
			||||||
    while (node) {
 | 
					 | 
				
			||||||
        AioHandler *tmp;
 | 
					 | 
				
			||||||
        int revents = node->pfd.revents;
 | 
					        int revents = node->pfd.revents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ctx->walking_handlers++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!node->deleted &&
 | 
					        if (!node->deleted &&
 | 
				
			||||||
            (revents || event_notifier_get_handle(node->e) == event) &&
 | 
					            (revents || event_notifier_get_handle(node->e) == event) &&
 | 
				
			||||||
            node->io_notify) {
 | 
					            node->io_notify) {
 | 
				
			||||||
@ -275,17 +273,17 @@ static bool aio_dispatch_handlers(AioContext *ctx, HANDLE event)
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tmp = node;
 | 
					        if (node->deleted) {
 | 
				
			||||||
        node = QLIST_NEXT(node, node);
 | 
					            ctx->walking_handlers--;
 | 
				
			||||||
 | 
					            if (!ctx->walking_handlers) {
 | 
				
			||||||
 | 
					                QLIST_REMOVE(node, node);
 | 
				
			||||||
 | 
					                g_free(node);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ctx->walking_handlers++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ctx->walking_handlers--;
 | 
					    ctx->walking_handlers--;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!ctx->walking_handlers && tmp->deleted) {
 | 
					 | 
				
			||||||
            QLIST_REMOVE(tmp, node);
 | 
					 | 
				
			||||||
            g_free(tmp);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return progress;
 | 
					    return progress;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user