All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kamil Rytarowski <n54@gmx.com>
To: Peter Maydell <peter.maydell@linaro.org>,
	qemu-devel@nongnu.org, qemu-trivial@nongnu.org
Cc: patches@linaro.org
Subject: Re: [Qemu-devel] [Qemu-trivial] [PATCH] util/qemu-thread-posix.c: Replace OS ifdefs with CONFIG_HAVE_SEM_TIMEDWAIT
Date: Tue, 5 Sep 2017 14:57:18 +0200	[thread overview]
Message-ID: <9daeb0c9-b1b3-66d4-2b0c-77affb449efd@gmx.com> (raw)
In-Reply-To: <1504613972-15847-1-git-send-email-peter.maydell@linaro.org>

[-- Attachment #1: Type: text/plain, Size: 4530 bytes --]

On 05.09.2017 14:19, Peter Maydell wrote:
> In qemu-thread-posix.c we have two implementations of the
> various qemu_sem_* functions, one of which uses native POSIX
> sem_* and the other of which emulates them with pthread conditions.
> This is necessary because not all our host OSes support
> sem_timedwait().
> 
> Instead of a hard-coded list of OSes which don't implement
> sem_timedwait(), which gets out of date, make configure
> test for the presence of the function and set a new
> CONFIG_HAVE_SEM_TIMEDWAIT appropriately.
> 
> In particular, newer NetBSDs have sem_timedwait(), so this
> commit will switch them over to using it. OSX still does
> not have an implementation.
> 

The NetBSD part looks fine. It builds fine on NetBSD/amd64 8.99.2. All
tests pass (with disabled PaX MPROTECT).

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Kamil Rytarowski <n54@gmx.com>

> ---
> It would be nice to gradually reduce the number of places
> we do per-OS ifdeffery in favour of checking for the specific
> feature we care about in each case...
> Tested on Linux, NetBSD, OSX.
> 
>  configure                   | 15 +++++++++++++++
>  include/qemu/thread-posix.h |  2 +-
>  util/qemu-thread-posix.c    | 10 +++++-----
>  3 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/configure b/configure
> index fb7e34a..aa8d4d9 100755
> --- a/configure
> +++ b/configure
> @@ -4448,6 +4448,18 @@ if compile_prog "" "" ; then
>  fi
>  
>  ##########################################
> +# check if we have sem_timedwait
> +
> +sem_timedwait=no
> +cat > $TMPC << EOF
> +#include <semaphore.h>
> +int main(void) { return sem_timedwait(0, 0); }
> +EOF
> +if compile_prog "" "" ; then
> +    sem_timedwait=yes
> +fi
> +
> +##########################################
>  # check if trace backend exists
>  
>  $python "$source_path/scripts/tracetool.py" "--backends=$trace_backends" --check-backends  > /dev/null 2> /dev/null
> @@ -5680,6 +5692,9 @@ fi
>  if test "$inotify1" = "yes" ; then
>    echo "CONFIG_INOTIFY1=y" >> $config_host_mak
>  fi
> +if test "$sem_timedwait" = "yes" ; then
> +  echo "CONFIG_SEM_TIMEDWAIT=y" >> $config_host_mak
> +fi
>  if test "$byteswap_h" = "yes" ; then
>    echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
>  fi
> diff --git a/include/qemu/thread-posix.h b/include/qemu/thread-posix.h
> index e5e3a0f..f4296d3 100644
> --- a/include/qemu/thread-posix.h
> +++ b/include/qemu/thread-posix.h
> @@ -21,7 +21,7 @@ struct QemuCond {
>  };
>  
>  struct QemuSemaphore {
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      pthread_mutex_t lock;
>      pthread_cond_t cond;
>      unsigned int count;
> diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
> index 4e95d27..7306475 100644
> --- a/util/qemu-thread-posix.c
> +++ b/util/qemu-thread-posix.c
> @@ -168,7 +168,7 @@ void qemu_sem_init(QemuSemaphore *sem, int init)
>  {
>      int rc;
>  
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      rc = pthread_mutex_init(&sem->lock, NULL);
>      if (rc != 0) {
>          error_exit(rc, __func__);
> @@ -196,7 +196,7 @@ void qemu_sem_destroy(QemuSemaphore *sem)
>  
>      assert(sem->initialized);
>      sem->initialized = false;
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      rc = pthread_cond_destroy(&sem->cond);
>      if (rc < 0) {
>          error_exit(rc, __func__);
> @@ -218,7 +218,7 @@ void qemu_sem_post(QemuSemaphore *sem)
>      int rc;
>  
>      assert(sem->initialized);
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      pthread_mutex_lock(&sem->lock);
>      if (sem->count == UINT_MAX) {
>          rc = EINVAL;
> @@ -256,7 +256,7 @@ int qemu_sem_timedwait(QemuSemaphore *sem, int ms)
>      struct timespec ts;
>  
>      assert(sem->initialized);
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      rc = 0;
>      compute_abs_deadline(&ts, ms);
>      pthread_mutex_lock(&sem->lock);
> @@ -304,7 +304,7 @@ void qemu_sem_wait(QemuSemaphore *sem)
>      int rc;
>  
>      assert(sem->initialized);
> -#if defined(__APPLE__) || defined(__NetBSD__)
> +#ifndef CONFIG_SEM_TIMEDWAIT
>      pthread_mutex_lock(&sem->lock);
>      while (sem->count == 0) {
>          rc = pthread_cond_wait(&sem->cond, &sem->lock);
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

  reply	other threads:[~2017-09-05 13:07 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-05 12:19 [Qemu-devel] [PATCH] util/qemu-thread-posix.c: Replace OS ifdefs with CONFIG_HAVE_SEM_TIMEDWAIT Peter Maydell
2017-09-05 12:57 ` Kamil Rytarowski [this message]
2017-09-05 14:11 ` Eric Blake
2017-09-14  7:53 ` Michael Tokarev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9daeb0c9-b1b3-66d4-2b0c-77affb449efd@gmx.com \
    --to=n54@gmx.com \
    --cc=patches@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-trivial@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.