f7311ccc63
ThreadPool is tied to an AioContext through its event notifier, which dictates in which AioContext the work item's callback function will be invoked. In order to support multiple AioContexts we need to support multiple ThreadPool instances. This patch adds the new/free functions. The free function deserves special attention because it quiesces remaining worker threads. This requires a new condition variable and a "stopping" flag to let workers know they should terminate once idle. We never needed to do this before since the global threadpool was not explicitly destroyed until process termination. Also stash the AioContext pointer in ThreadPool so that we can call aio_set_event_notifier() in thread_pool_free(). We didn't need to hold onto AioContext previously since there was no free function. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
/*
|
|
* QEMU block layer thread pool
|
|
*
|
|
* Copyright IBM, Corp. 2008
|
|
* Copyright Red Hat, Inc. 2012
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
* Paolo Bonzini <pbonzini@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
* Contributions after 2012-01-13 are licensed under the terms of the
|
|
* GNU GPL, version 2 or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef QEMU_THREAD_POOL_H
|
|
#define QEMU_THREAD_POOL_H 1
|
|
|
|
#include "qemu-common.h"
|
|
#include "qemu/queue.h"
|
|
#include "qemu/thread.h"
|
|
#include "block/coroutine.h"
|
|
#include "block/block_int.h"
|
|
|
|
typedef int ThreadPoolFunc(void *opaque);
|
|
|
|
typedef struct ThreadPool ThreadPool;
|
|
|
|
ThreadPool *thread_pool_new(struct AioContext *ctx);
|
|
void thread_pool_free(ThreadPool *pool);
|
|
|
|
BlockDriverAIOCB *thread_pool_submit_aio(ThreadPoolFunc *func, void *arg,
|
|
BlockDriverCompletionFunc *cb, void *opaque);
|
|
int coroutine_fn thread_pool_submit_co(ThreadPoolFunc *func, void *arg);
|
|
void thread_pool_submit(ThreadPoolFunc *func, void *arg);
|
|
|
|
#endif
|