mirror of https://github.com/xemu-project/xemu.git
thread-posix: remove the posix semaphore support
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>
This commit is contained in:
parent
d7482ffe97
commit
f9fc8932b1
|
@ -27,13 +27,9 @@ struct QemuCond {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QemuSemaphore {
|
struct QemuSemaphore {
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
pthread_cond_t cond;
|
pthread_cond_t cond;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
#else
|
|
||||||
sem_t sem;
|
|
||||||
#endif
|
|
||||||
bool initialized;
|
bool initialized;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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_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_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_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_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_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
|
||||||
config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
|
config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
|
||||||
|
|
|
@ -219,7 +219,6 @@ void qemu_sem_init(QemuSemaphore *sem, int init)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
rc = pthread_mutex_init(&sem->lock, NULL);
|
rc = pthread_mutex_init(&sem->lock, NULL);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
error_exit(rc, __func__);
|
error_exit(rc, __func__);
|
||||||
|
@ -232,12 +231,6 @@ void qemu_sem_init(QemuSemaphore *sem, int init)
|
||||||
error_exit(EINVAL, __func__);
|
error_exit(EINVAL, __func__);
|
||||||
}
|
}
|
||||||
sem->count = init;
|
sem->count = init;
|
||||||
#else
|
|
||||||
rc = sem_init(&sem->sem, 0, init);
|
|
||||||
if (rc < 0) {
|
|
||||||
error_exit(errno, __func__);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
sem->initialized = true;
|
sem->initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +240,6 @@ void qemu_sem_destroy(QemuSemaphore *sem)
|
||||||
|
|
||||||
assert(sem->initialized);
|
assert(sem->initialized);
|
||||||
sem->initialized = false;
|
sem->initialized = false;
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
rc = pthread_cond_destroy(&sem->cond);
|
rc = pthread_cond_destroy(&sem->cond);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
error_exit(rc, __func__);
|
error_exit(rc, __func__);
|
||||||
|
@ -256,12 +248,6 @@ void qemu_sem_destroy(QemuSemaphore *sem)
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
error_exit(rc, __func__);
|
error_exit(rc, __func__);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
rc = sem_destroy(&sem->sem);
|
|
||||||
if (rc < 0) {
|
|
||||||
error_exit(errno, __func__);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_sem_post(QemuSemaphore *sem)
|
void qemu_sem_post(QemuSemaphore *sem)
|
||||||
|
@ -269,7 +255,6 @@ void qemu_sem_post(QemuSemaphore *sem)
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
assert(sem->initialized);
|
assert(sem->initialized);
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
pthread_mutex_lock(&sem->lock);
|
pthread_mutex_lock(&sem->lock);
|
||||||
if (sem->count == UINT_MAX) {
|
if (sem->count == UINT_MAX) {
|
||||||
rc = EINVAL;
|
rc = EINVAL;
|
||||||
|
@ -281,12 +266,6 @@ void qemu_sem_post(QemuSemaphore *sem)
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
error_exit(rc, __func__);
|
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)
|
int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
|
||||||
|
@ -295,7 +274,6 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
|
||||||
assert(sem->initialized);
|
assert(sem->initialized);
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
compute_abs_deadline(&ts, ms);
|
compute_abs_deadline(&ts, ms);
|
||||||
pthread_mutex_lock(&sem->lock);
|
pthread_mutex_lock(&sem->lock);
|
||||||
|
@ -313,29 +291,6 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&sem->lock);
|
pthread_mutex_unlock(&sem->lock);
|
||||||
return (rc == ETIMEDOUT ? -1 : 0);
|
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)
|
void qemu_sem_wait(QemuSemaphore *sem)
|
||||||
|
@ -343,7 +298,6 @@ void qemu_sem_wait(QemuSemaphore *sem)
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
assert(sem->initialized);
|
assert(sem->initialized);
|
||||||
#ifndef CONFIG_SEM_TIMEDWAIT
|
|
||||||
pthread_mutex_lock(&sem->lock);
|
pthread_mutex_lock(&sem->lock);
|
||||||
while (sem->count == 0) {
|
while (sem->count == 0) {
|
||||||
rc = pthread_cond_wait(&sem->cond, &sem->lock);
|
rc = pthread_cond_wait(&sem->cond, &sem->lock);
|
||||||
|
@ -353,14 +307,6 @@ void qemu_sem_wait(QemuSemaphore *sem)
|
||||||
}
|
}
|
||||||
--sem->count;
|
--sem->count;
|
||||||
pthread_mutex_unlock(&sem->lock);
|
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__
|
#ifdef __linux__
|
||||||
|
|
Loading…
Reference in New Issue