Commit b7680cb6 authored by Jan Kiszka's avatar Jan Kiszka Committed by Blue Swirl
Browse files

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: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarBlue Swirl <blauwirbel@gmail.com>
parent 68c23e55
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -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;
}
@@ -699,7 +699,7 @@ int qemu_init_main_loop(void)
    qemu_mutex_init(&qemu_global_mutex);
    qemu_mutex_lock(&qemu_global_mutex);

    qemu_thread_self(&io_thread);
    qemu_thread_get_self(&io_thread);

    return 0;
}
@@ -714,7 +714,7 @@ void run_on_cpu(CPUState *env, void (*func)(void *data), void *data)
{
    struct qemu_work_item wi;

    if (qemu_cpu_self(env)) {
    if (qemu_cpu_is_self(env)) {
        func(data);
        return;
    }
@@ -808,7 +808,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
    int r;

    qemu_mutex_lock(&qemu_global_mutex);
    qemu_thread_self(env->thread);
    qemu_thread_get_self(env->thread);

    r = kvm_init_vcpu(env);
    if (r < 0) {
@@ -845,7 +845,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
    CPUState *env = arg;

    qemu_tcg_init_cpu_signals();
    qemu_thread_self(env->thread);
    qemu_thread_get_self(env->thread);

    /* signal CPU creation */
    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;
    QemuThread this;

    qemu_thread_self(&this);

    return qemu_thread_equal(&this, env->thread);
    return qemu_thread_is_self(env->thread);
}

void qemu_mutex_lock_iothread(void)
@@ -1023,10 +1020,7 @@ void cpu_stop_current(void)

void vm_stop(int reason)
{
    QemuThread me;
    qemu_thread_self(&me);

    if (!qemu_thread_equal(&me, &io_thread)) {
    if (!qemu_thread_is_self(&io_thread)) {
        qemu_system_vmstop_request(reason);
        /*
         * FIXME: should not return to device code in case
+1 −1
Original line number Diff line number Diff line
@@ -1640,7 +1640,7 @@ void cpu_interrupt(CPUState *env, int mask)
     * If called from iothread context, wake the target cpu in
     * case its halted.
     */
    if (!qemu_cpu_self(env)) {
    if (!qemu_cpu_is_self(env)) {
        qemu_cpu_kick(env);
        return;
    }
+1 −1
Original line number Diff line number Diff line
@@ -290,7 +290,7 @@ void qemu_notify_event(void);
/* Unblock cpu */
void qemu_cpu_kick(void *env);
void qemu_cpu_kick_self(void);
int qemu_cpu_self(void *env);
int qemu_cpu_is_self(void *env);

/* work queue */
struct qemu_work_item {
+3 −3
Original line number Diff line number Diff line
@@ -176,14 +176,14 @@ void qemu_thread_signal(QemuThread *thread, int sig)
        error_exit(err, __func__);
}

void qemu_thread_self(QemuThread *thread)
void qemu_thread_get_self(QemuThread *thread)
{
    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)
+2 −2
Original line number Diff line number Diff line
@@ -37,8 +37,8 @@ void qemu_thread_create(QemuThread *thread,
                       void *(*start_routine)(void*),
                       void *arg);
void qemu_thread_signal(QemuThread *thread, int sig);
void qemu_thread_self(QemuThread *thread);
int qemu_thread_equal(QemuThread *thread1, QemuThread *thread2);
void qemu_thread_get_self(QemuThread *thread);
int qemu_thread_is_self(QemuThread *thread);
void qemu_thread_exit(void *retval);

#endif
Loading