1*32cad1ffSPhilippe Mathieu-Daudé /* 2*32cad1ffSPhilippe Mathieu-Daudé * Event loop thread 3*32cad1ffSPhilippe Mathieu-Daudé * 4*32cad1ffSPhilippe Mathieu-Daudé * Copyright Red Hat Inc., 2013 5*32cad1ffSPhilippe Mathieu-Daudé * 6*32cad1ffSPhilippe Mathieu-Daudé * Authors: 7*32cad1ffSPhilippe Mathieu-Daudé * Stefan Hajnoczi <stefanha@redhat.com> 8*32cad1ffSPhilippe Mathieu-Daudé * 9*32cad1ffSPhilippe Mathieu-Daudé * This work is licensed under the terms of the GNU GPL, version 2 or later. 10*32cad1ffSPhilippe Mathieu-Daudé * See the COPYING file in the top-level directory. 11*32cad1ffSPhilippe Mathieu-Daudé * 12*32cad1ffSPhilippe Mathieu-Daudé */ 13*32cad1ffSPhilippe Mathieu-Daudé 14*32cad1ffSPhilippe Mathieu-Daudé #ifndef IOTHREAD_H 15*32cad1ffSPhilippe Mathieu-Daudé #define IOTHREAD_H 16*32cad1ffSPhilippe Mathieu-Daudé 17*32cad1ffSPhilippe Mathieu-Daudé #include "block/aio.h" 18*32cad1ffSPhilippe Mathieu-Daudé #include "qemu/thread.h" 19*32cad1ffSPhilippe Mathieu-Daudé #include "qom/object.h" 20*32cad1ffSPhilippe Mathieu-Daudé #include "system/event-loop-base.h" 21*32cad1ffSPhilippe Mathieu-Daudé 22*32cad1ffSPhilippe Mathieu-Daudé #define TYPE_IOTHREAD "iothread" 23*32cad1ffSPhilippe Mathieu-Daudé 24*32cad1ffSPhilippe Mathieu-Daudé struct IOThread { 25*32cad1ffSPhilippe Mathieu-Daudé EventLoopBase parent_obj; 26*32cad1ffSPhilippe Mathieu-Daudé 27*32cad1ffSPhilippe Mathieu-Daudé QemuThread thread; 28*32cad1ffSPhilippe Mathieu-Daudé AioContext *ctx; 29*32cad1ffSPhilippe Mathieu-Daudé bool run_gcontext; /* whether we should run gcontext */ 30*32cad1ffSPhilippe Mathieu-Daudé GMainContext *worker_context; 31*32cad1ffSPhilippe Mathieu-Daudé GMainLoop *main_loop; 32*32cad1ffSPhilippe Mathieu-Daudé QemuSemaphore init_done_sem; /* is thread init done? */ 33*32cad1ffSPhilippe Mathieu-Daudé bool stopping; /* has iothread_stop() been called? */ 34*32cad1ffSPhilippe Mathieu-Daudé bool running; /* should iothread_run() continue? */ 35*32cad1ffSPhilippe Mathieu-Daudé int thread_id; 36*32cad1ffSPhilippe Mathieu-Daudé 37*32cad1ffSPhilippe Mathieu-Daudé /* AioContext poll parameters */ 38*32cad1ffSPhilippe Mathieu-Daudé int64_t poll_max_ns; 39*32cad1ffSPhilippe Mathieu-Daudé int64_t poll_grow; 40*32cad1ffSPhilippe Mathieu-Daudé int64_t poll_shrink; 41*32cad1ffSPhilippe Mathieu-Daudé }; 42*32cad1ffSPhilippe Mathieu-Daudé typedef struct IOThread IOThread; 43*32cad1ffSPhilippe Mathieu-Daudé 44*32cad1ffSPhilippe Mathieu-Daudé DECLARE_INSTANCE_CHECKER(IOThread, IOTHREAD, 45*32cad1ffSPhilippe Mathieu-Daudé TYPE_IOTHREAD) 46*32cad1ffSPhilippe Mathieu-Daudé 47*32cad1ffSPhilippe Mathieu-Daudé char *iothread_get_id(IOThread *iothread); 48*32cad1ffSPhilippe Mathieu-Daudé IOThread *iothread_by_id(const char *id); 49*32cad1ffSPhilippe Mathieu-Daudé AioContext *iothread_get_aio_context(IOThread *iothread); 50*32cad1ffSPhilippe Mathieu-Daudé GMainContext *iothread_get_g_main_context(IOThread *iothread); 51*32cad1ffSPhilippe Mathieu-Daudé 52*32cad1ffSPhilippe Mathieu-Daudé /* 53*32cad1ffSPhilippe Mathieu-Daudé * Helpers used to allocate iothreads for internal use. These 54*32cad1ffSPhilippe Mathieu-Daudé * iothreads will not be seen by monitor clients when query using 55*32cad1ffSPhilippe Mathieu-Daudé * "query-iothreads". 56*32cad1ffSPhilippe Mathieu-Daudé */ 57*32cad1ffSPhilippe Mathieu-Daudé IOThread *iothread_create(const char *id, Error **errp); 58*32cad1ffSPhilippe Mathieu-Daudé void iothread_stop(IOThread *iothread); 59*32cad1ffSPhilippe Mathieu-Daudé void iothread_destroy(IOThread *iothread); 60*32cad1ffSPhilippe Mathieu-Daudé 61*32cad1ffSPhilippe Mathieu-Daudé /* 62*32cad1ffSPhilippe Mathieu-Daudé * Returns true if executing within IOThread context, 63*32cad1ffSPhilippe Mathieu-Daudé * false otherwise. 64*32cad1ffSPhilippe Mathieu-Daudé */ 65*32cad1ffSPhilippe Mathieu-Daudé bool qemu_in_iothread(void); 66*32cad1ffSPhilippe Mathieu-Daudé 67*32cad1ffSPhilippe Mathieu-Daudé #endif /* IOTHREAD_H */ 68