Skip to content

Commit

Permalink
thread-posix: remove the posix semaphore support
Browse files Browse the repository at this point in the history
POSIX specifies an absolute time for sem_timedwait(), it would be
affected if the system time is changing, but there is not a relative
time or monotonic clock version of sem_timedwait, so we cannot gain
from POSIX semaphore any more.

An alternative way is to use sem_trywait + usleep, maybe we can
remove CONFIG_SEM_TIMEDWAIT in this way? No, because some systems
(e.g. mac os) mark the sem_xxx API as deprecated.

So maybe remove the usage of POSIX semaphore and turn to use the
pthread variant for all systems looks better.

Signed-off-by: Longpeng(Mike) <longpeng2@huawei.com>
Message-Id: <20220222090507.2028-2-longpeng2@huawei.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Longpeng(Mike) authored and bonzini committed Apr 3, 2022
1 parent d567bd3 commit 550d4da
Show file tree
Hide file tree
Showing 3 changed files with 0 additions and 59 deletions.
4 changes: 0 additions & 4 deletions include/qemu/thread-posix.h
Expand Up @@ -27,13 +27,9 @@ struct QemuCond {
};

struct QemuSemaphore {
#ifndef CONFIG_SEM_TIMEDWAIT
pthread_mutex_t lock;
pthread_cond_t cond;
unsigned int count;
#else
sem_t sem;
#endif
bool initialized;
};

Expand Down
1 change: 0 additions & 1 deletion meson.build
Expand Up @@ -1632,7 +1632,6 @@ config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
Expand Down
54 changes: 0 additions & 54 deletions util/qemu-thread-posix.c
Expand Up @@ -219,7 +219,6 @@ void qemu_sem_init(QemuSemaphore *sem, int init)
{
int rc;

#ifndef CONFIG_SEM_TIMEDWAIT
rc = pthread_mutex_init(&sem->lock, NULL);
if (rc != 0) {
error_exit(rc, __func__);
Expand All @@ -232,12 +231,6 @@ void qemu_sem_init(QemuSemaphore *sem, int init)
error_exit(EINVAL, __func__);
}
sem->count = init;
#else
rc = sem_init(&sem->sem, 0, init);
if (rc < 0) {
error_exit(errno, __func__);
}
#endif
sem->initialized = true;
}

Expand All @@ -247,7 +240,6 @@ void qemu_sem_destroy(QemuSemaphore *sem)

assert(sem->initialized);
sem->initialized = false;
#ifndef CONFIG_SEM_TIMEDWAIT
rc = pthread_cond_destroy(&sem->cond);
if (rc < 0) {
error_exit(rc, __func__);
Expand All @@ -256,20 +248,13 @@ void qemu_sem_destroy(QemuSemaphore *sem)
if (rc < 0) {
error_exit(rc, __func__);
}
#else
rc = sem_destroy(&sem->sem);
if (rc < 0) {
error_exit(errno, __func__);
}
#endif
}

void qemu_sem_post(QemuSemaphore *sem)
{
int rc;

assert(sem->initialized);
#ifndef CONFIG_SEM_TIMEDWAIT
pthread_mutex_lock(&sem->lock);
if (sem->count == UINT_MAX) {
rc = EINVAL;
Expand All @@ -281,12 +266,6 @@ void qemu_sem_post(QemuSemaphore *sem)
if (rc != 0) {
error_exit(rc, __func__);
}
#else
rc = sem_post(&sem->sem);
if (rc < 0) {
error_exit(errno, __func__);
}
#endif
}

int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
Expand All @@ -295,7 +274,6 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
struct timespec ts;

assert(sem->initialized);
#ifndef CONFIG_SEM_TIMEDWAIT
rc = 0;
compute_abs_deadline(&ts, ms);
pthread_mutex_lock(&sem->lock);
Expand All @@ -313,37 +291,13 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
}
pthread_mutex_unlock(&sem->lock);
return (rc == ETIMEDOUT ? -1 : 0);
#else
if (ms <= 0) {
/* This is cheaper than sem_timedwait. */
do {
rc = sem_trywait(&sem->sem);
} while (rc == -1 && errno == EINTR);
if (rc == -1 && errno == EAGAIN) {
return -1;
}
} else {
compute_abs_deadline(&ts, ms);
do {
rc = sem_timedwait(&sem->sem, &ts);
} while (rc == -1 && errno == EINTR);
if (rc == -1 && errno == ETIMEDOUT) {
return -1;
}
}
if (rc < 0) {
error_exit(errno, __func__);
}
return 0;
#endif
}

void qemu_sem_wait(QemuSemaphore *sem)
{
int rc;

assert(sem->initialized);
#ifndef CONFIG_SEM_TIMEDWAIT
pthread_mutex_lock(&sem->lock);
while (sem->count == 0) {
rc = pthread_cond_wait(&sem->cond, &sem->lock);
Expand All @@ -353,14 +307,6 @@ void qemu_sem_wait(QemuSemaphore *sem)
}
--sem->count;
pthread_mutex_unlock(&sem->lock);
#else
do {
rc = sem_wait(&sem->sem);
} while (rc == -1 && errno == EINTR);
if (rc < 0) {
error_exit(errno, __func__);
}
#endif
}

#ifdef __linux__
Expand Down

0 comments on commit 550d4da

Please sign in to comment.