mirror of
https://github.com/xemu-project/xemu.git
synced 2025-01-31 17:23:53 +00:00
Refactor thread retrieval and check
We have qemu_cpu_self and qemu_thread_self. The latter is retrieving the current thread, the former is checking for equality (using CPUState). We also have qemu_thread_equal which is only used like qemu_cpu_self. This refactors the interfaces, creating qemu_cpu_is_self and qemu_thread_is_self as well ass qemu_thread_get_self. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
68c23e5520
commit
b7680cb607
22
cpus.c
22
cpus.c
@ -531,7 +531,7 @@ void qemu_init_vcpu(void *_env)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int qemu_cpu_self(void *env)
|
int qemu_cpu_is_self(void *env)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -699,7 +699,7 @@ int qemu_init_main_loop(void)
|
|||||||
qemu_mutex_init(&qemu_global_mutex);
|
qemu_mutex_init(&qemu_global_mutex);
|
||||||
qemu_mutex_lock(&qemu_global_mutex);
|
qemu_mutex_lock(&qemu_global_mutex);
|
||||||
|
|
||||||
qemu_thread_self(&io_thread);
|
qemu_thread_get_self(&io_thread);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -714,7 +714,7 @@ void run_on_cpu(CPUState *env, void (*func)(void *data), void *data)
|
|||||||
{
|
{
|
||||||
struct qemu_work_item wi;
|
struct qemu_work_item wi;
|
||||||
|
|
||||||
if (qemu_cpu_self(env)) {
|
if (qemu_cpu_is_self(env)) {
|
||||||
func(data);
|
func(data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -808,7 +808,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
qemu_mutex_lock(&qemu_global_mutex);
|
qemu_mutex_lock(&qemu_global_mutex);
|
||||||
qemu_thread_self(env->thread);
|
qemu_thread_get_self(env->thread);
|
||||||
|
|
||||||
r = kvm_init_vcpu(env);
|
r = kvm_init_vcpu(env);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
@ -845,7 +845,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
|||||||
CPUState *env = arg;
|
CPUState *env = arg;
|
||||||
|
|
||||||
qemu_tcg_init_cpu_signals();
|
qemu_tcg_init_cpu_signals();
|
||||||
qemu_thread_self(env->thread);
|
qemu_thread_get_self(env->thread);
|
||||||
|
|
||||||
/* signal CPU creation */
|
/* signal CPU creation */
|
||||||
qemu_mutex_lock(&qemu_global_mutex);
|
qemu_mutex_lock(&qemu_global_mutex);
|
||||||
@ -888,14 +888,11 @@ void qemu_cpu_kick_self(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int qemu_cpu_self(void *_env)
|
int qemu_cpu_is_self(void *_env)
|
||||||
{
|
{
|
||||||
CPUState *env = _env;
|
CPUState *env = _env;
|
||||||
QemuThread this;
|
|
||||||
|
|
||||||
qemu_thread_self(&this);
|
return qemu_thread_is_self(env->thread);
|
||||||
|
|
||||||
return qemu_thread_equal(&this, env->thread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_mutex_lock_iothread(void)
|
void qemu_mutex_lock_iothread(void)
|
||||||
@ -1023,10 +1020,7 @@ void cpu_stop_current(void)
|
|||||||
|
|
||||||
void vm_stop(int reason)
|
void vm_stop(int reason)
|
||||||
{
|
{
|
||||||
QemuThread me;
|
if (!qemu_thread_is_self(&io_thread)) {
|
||||||
qemu_thread_self(&me);
|
|
||||||
|
|
||||||
if (!qemu_thread_equal(&me, &io_thread)) {
|
|
||||||
qemu_system_vmstop_request(reason);
|
qemu_system_vmstop_request(reason);
|
||||||
/*
|
/*
|
||||||
* FIXME: should not return to device code in case
|
* FIXME: should not return to device code in case
|
||||||
|
2
exec.c
2
exec.c
@ -1640,7 +1640,7 @@ void cpu_interrupt(CPUState *env, int mask)
|
|||||||
* If called from iothread context, wake the target cpu in
|
* If called from iothread context, wake the target cpu in
|
||||||
* case its halted.
|
* case its halted.
|
||||||
*/
|
*/
|
||||||
if (!qemu_cpu_self(env)) {
|
if (!qemu_cpu_is_self(env)) {
|
||||||
qemu_cpu_kick(env);
|
qemu_cpu_kick(env);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@ void qemu_notify_event(void);
|
|||||||
/* Unblock cpu */
|
/* Unblock cpu */
|
||||||
void qemu_cpu_kick(void *env);
|
void qemu_cpu_kick(void *env);
|
||||||
void qemu_cpu_kick_self(void);
|
void qemu_cpu_kick_self(void);
|
||||||
int qemu_cpu_self(void *env);
|
int qemu_cpu_is_self(void *env);
|
||||||
|
|
||||||
/* work queue */
|
/* work queue */
|
||||||
struct qemu_work_item {
|
struct qemu_work_item {
|
||||||
|
@ -176,14 +176,14 @@ void qemu_thread_signal(QemuThread *thread, int sig)
|
|||||||
error_exit(err, __func__);
|
error_exit(err, __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_thread_self(QemuThread *thread)
|
void qemu_thread_get_self(QemuThread *thread)
|
||||||
{
|
{
|
||||||
thread->thread = pthread_self();
|
thread->thread = pthread_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
int qemu_thread_equal(QemuThread *thread1, QemuThread *thread2)
|
int qemu_thread_is_self(QemuThread *thread)
|
||||||
{
|
{
|
||||||
return pthread_equal(thread1->thread, thread2->thread);
|
return pthread_equal(pthread_self(), thread->thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_thread_exit(void *retval)
|
void qemu_thread_exit(void *retval)
|
||||||
|
@ -37,8 +37,8 @@ void qemu_thread_create(QemuThread *thread,
|
|||||||
void *(*start_routine)(void*),
|
void *(*start_routine)(void*),
|
||||||
void *arg);
|
void *arg);
|
||||||
void qemu_thread_signal(QemuThread *thread, int sig);
|
void qemu_thread_signal(QemuThread *thread, int sig);
|
||||||
void qemu_thread_self(QemuThread *thread);
|
void qemu_thread_get_self(QemuThread *thread);
|
||||||
int qemu_thread_equal(QemuThread *thread1, QemuThread *thread2);
|
int qemu_thread_is_self(QemuThread *thread);
|
||||||
void qemu_thread_exit(void *retval);
|
void qemu_thread_exit(void *retval);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1355,7 +1355,7 @@ int kvm_arch_put_registers(CPUState *env, int level)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(cpu_is_stopped(env) || qemu_cpu_self(env));
|
assert(cpu_is_stopped(env) || qemu_cpu_is_self(env));
|
||||||
|
|
||||||
ret = kvm_getput_regs(env, 1);
|
ret = kvm_getput_regs(env, 1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -1403,7 +1403,7 @@ int kvm_arch_get_registers(CPUState *env)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(cpu_is_stopped(env) || qemu_cpu_self(env));
|
assert(cpu_is_stopped(env) || qemu_cpu_is_self(env));
|
||||||
|
|
||||||
ret = kvm_getput_regs(env, 0);
|
ret = kvm_getput_regs(env, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -303,7 +303,7 @@ static void *vnc_worker_thread(void *arg)
|
|||||||
{
|
{
|
||||||
VncJobQueue *queue = arg;
|
VncJobQueue *queue = arg;
|
||||||
|
|
||||||
qemu_thread_self(&queue->thread);
|
qemu_thread_get_self(&queue->thread);
|
||||||
|
|
||||||
while (!vnc_worker_thread_loop(queue)) ;
|
while (!vnc_worker_thread_loop(queue)) ;
|
||||||
vnc_queue_clear(queue);
|
vnc_queue_clear(queue);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user