This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e43a4d31c sim: To avoid system calls being interrupted when use host 
api
9e43a4d31c is described below

commit 9e43a4d31c17ec603c1f5b64a992aa7a000de827
Author: yintao <[email protected]>
AuthorDate: Wed Aug 23 12:36:36 2023 +0800

    sim: To avoid system calls being interrupted when use host api
    
    Signed-off-by: yintao <[email protected]>
---
 arch/sim/src/sim/posix/sim_alsa.c       | 130 +++++++++++++++++---------------
 arch/sim/src/sim/posix/sim_hostmemory.c |  78 +++++++------------
 arch/sim/src/sim/posix/sim_hostmisc.c   |  41 ++++------
 arch/sim/src/sim/sim_internal.h         |  21 ++++++
 4 files changed, 130 insertions(+), 140 deletions(-)

diff --git a/arch/sim/src/sim/posix/sim_alsa.c 
b/arch/sim/src/sim/posix/sim_alsa.c
index 366d74bfe8..9fc1e148b4 100644
--- a/arch/sim/src/sim/posix/sim_alsa.c
+++ b/arch/sim/src/sim/posix/sim_alsa.c
@@ -33,6 +33,7 @@
 
 #include <alsa/asoundlib.h>
 
+#include "sim_internal.h"
 #include "sim_offload.h"
 
 /****************************************************************************
@@ -161,40 +162,41 @@ static int sim_audio_config_format(struct sim_audio_s 
*priv, snd_pcm_t *pcm)
         break;
     }
 
-  ret = snd_pcm_hw_params_malloc(&hw_params);
+  ret = host_uninterruptible(snd_pcm_hw_params_malloc, &hw_params);
   if (ret < 0)
     {
       return ret;
     }
 
-  ret = snd_pcm_hw_params_any(pcm, hw_params);
+  ret = host_uninterruptible(snd_pcm_hw_params_any, pcm, hw_params);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_pcm_hw_params_set_access(pcm, hw_params,
-                                     SND_PCM_ACCESS_RW_INTERLEAVED);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_access, pcm,
+                             hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_pcm_hw_params_set_format(pcm, hw_params, format);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_format, pcm,
+                             hw_params, format);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_pcm_hw_params_set_rate(pcm, hw_params,
-                                   priv->sample_rate, 0);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_rate, pcm,
+                             hw_params, priv->sample_rate, 0);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_pcm_hw_params_set_channels(pcm, hw_params,
-                                       priv->channels);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_channels, pcm,
+                             hw_params, priv->channels);
   if (ret < 0)
     {
       goto fail;
@@ -203,8 +205,8 @@ static int sim_audio_config_format(struct sim_audio_s 
*priv, snd_pcm_t *pcm)
   total_size = priv->nbuffers * priv->buffer_size;
 
   pframes = priv->buffer_size / priv->frame_size;
-  ret = snd_pcm_hw_params_set_period_size_near(pcm, hw_params,
-                                               &pframes, NULL);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_period_size_near,
+                             pcm, hw_params, &pframes, NULL);
   if (ret < 0)
     {
       goto fail;
@@ -212,17 +214,17 @@ static int sim_audio_config_format(struct sim_audio_s 
*priv, snd_pcm_t *pcm)
 
   priv->buffer_size = pframes * priv->frame_size;
   priv->nbuffers    = total_size / priv->buffer_size;
-  ret = snd_pcm_hw_params_set_periods_near(pcm, hw_params,
-                                           &priv->nbuffers, NULL);
+  ret = host_uninterruptible(snd_pcm_hw_params_set_periods_near, pcm,
+                             hw_params, &priv->nbuffers, NULL);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_pcm_hw_params(pcm, hw_params);
+  ret = host_uninterruptible(snd_pcm_hw_params, pcm, hw_params);
 
 fail:
-  snd_pcm_hw_params_free(hw_params);
+  host_uninterruptible_no_return(snd_pcm_hw_params_free, hw_params);
   return ret;
 }
 
@@ -249,7 +251,6 @@ static void sim_audio_config_ops(struct sim_audio_s *priv, 
uint8_t fmt)
 
 static int sim_audio_open(struct sim_audio_s *priv)
 {
-  irqstate_t flags;
   snd_pcm_t *pcm = NULL;
   int direction;
   int ret;
@@ -259,15 +260,13 @@ static int sim_audio_open(struct sim_audio_s *priv)
       return -ENXIO;
     }
 
-  flags = up_irq_save();
-
   direction = priv->playback ? SND_PCM_STREAM_PLAYBACK
                              : SND_PCM_STREAM_CAPTURE;
 
-  ret = snd_pcm_open(&pcm, "default", direction, 0);
+  ret = host_uninterruptible(snd_pcm_open, &pcm, "default", direction, 0);
   if (ret < 0)
     {
-      goto fail;
+      return ret;
     }
 
   ret = sim_audio_config_format(priv, pcm);
@@ -276,7 +275,7 @@ static int sim_audio_open(struct sim_audio_s *priv)
       goto fail;
     }
 
-  ret = snd_pcm_start(pcm);
+  ret = host_uninterruptible(snd_pcm_start, pcm);
   if (ret < 0)
     {
       goto fail;
@@ -284,12 +283,12 @@ static int sim_audio_open(struct sim_audio_s *priv)
 
   priv->pcm = pcm;
 
-  up_irq_restore(flags);
   return 0;
 
 fail:
   snd_pcm_close(pcm);
   up_irq_restore(flags);
+  host_uninterruptible(snd_pcm_close, pcm);
   return ret;
 }
 
@@ -300,7 +299,7 @@ static int sim_audio_close(struct sim_audio_s *priv)
       return -ENXIO;
     }
 
-  snd_pcm_close(priv->pcm);
+  host_uninterruptible(snd_pcm_close, priv->pcm);
 
   priv->pcm = NULL;
 
@@ -380,15 +379,17 @@ static int sim_audio_getcaps(struct audio_lowerhalf_s 
*dev, int type,
         switch (caps->ac_format.hw)
           {
             case AUDIO_FU_VOLUME:
-              snd_mixer_selem_get_playback_volume(priv->volume,
-                                        SND_MIXER_SCHN_UNKNOWN,
-                                        &val);
+              host_uninterruptible(snd_mixer_selem_get_playback_volume,
+                                   priv->volume,
+                                   SND_MIXER_SCHN_UNKNOWN,
+                                   &val);
               caps->ac_controls.w = val;
               break;
             case AUDIO_FU_INP_GAIN:
-              snd_mixer_selem_get_capture_volume(priv->volume,
-                                        SND_MIXER_SCHN_MONO,
-                                        &val);
+              host_uninterruptible(snd_mixer_selem_get_capture_volume,
+                                   priv->volume,
+                                   SND_MIXER_SCHN_MONO,
+                                   &val);
               caps->ac_controls.w = val;
               break;
             default:
@@ -430,12 +431,14 @@ static int sim_audio_configure(struct audio_lowerhalf_s 
*dev,
         switch (caps->ac_format.hw)
           {
             case AUDIO_FU_VOLUME:
-              ret = snd_mixer_selem_set_playback_volume_all(priv->volume,
-                                                caps->ac_controls.hw[0]);
+              ret = host_uninterruptible(
+                      snd_mixer_selem_set_playback_volume_all,
+                      priv->volume, caps->ac_controls.hw[0]);
               break;
             case AUDIO_FU_INP_GAIN:
-              ret = snd_mixer_selem_set_capture_volume_all(priv->volume,
-                                                caps->ac_controls.hw[0]);
+              ret = host_uninterruptible(
+                        snd_mixer_selem_set_capture_volume_all,
+                        priv->volume, caps->ac_controls.hw[0]);
               break;
             default:
               ret = -ENOTTY;
@@ -632,7 +635,7 @@ static int sim_alsa_get_latency(struct audio_lowerhalf_s 
*dev,
       return -ENXIO;
     }
 
-  ret = snd_pcm_delay(priv->pcm, latency);
+  ret = host_uninterruptible(snd_pcm_delay, priv->pcm, latency);
   if (ret < 0)
     {
       return ret;
@@ -817,7 +820,8 @@ static int sim_audio_process_playback(struct sim_audio_s 
*priv,
 
       aux->curbyte += ret;
 
-      ret  = snd_pcm_writei(priv->pcm, out, outsize / priv->frame_size);
+      ret  = host_uninterruptible(snd_pcm_writei, priv->pcm, out,
+                                  outsize / priv->frame_size);
       ret *= priv->frame_size;
     }
 
@@ -845,7 +849,8 @@ static int sim_audio_process_capture(struct sim_audio_s 
*priv,
   int frames = 0;
   int ret;
 
-  frames = snd_pcm_readi(priv->pcm, apb->samp, expect);
+  frames = host_uninterruptible(snd_pcm_readi, priv->pcm,
+                                apb->samp, expect);
   if (frames < 0)
     {
       return frames;
@@ -927,7 +932,7 @@ static void sim_audio_process(struct sim_audio_s *priv)
                               / priv->frame_size;
     }
 
-  avail = snd_pcm_avail(priv->pcm);
+  avail = host_uninterruptible(snd_pcm_avail, priv->pcm);
   if (avail < expect)
     {
       return;
@@ -973,7 +978,7 @@ static void sim_audio_process(struct sim_audio_s *priv)
 
       if (final)
         {
-          snd_pcm_drain(priv->pcm);
+          host_uninterruptible(snd_pcm_drain, priv->pcm);
 #ifdef CONFIG_AUDIO_MULTI_SESSION
           sim_audio_stop(&priv->dev, NULL);
 #else
@@ -988,46 +993,47 @@ out:
   if (ret == -EPIPE)
     {
       awarn("ALSA buffer xrun.\n");
-      snd_pcm_prepare(priv->pcm);
-      snd_pcm_start(priv->pcm);
+      host_uninterruptible(snd_pcm_prepare, priv->pcm);
+      host_uninterruptible(snd_pcm_start, priv->pcm);
     }
   else if (ret != -EAGAIN)
     {
-      aerr("pcm writei/readi failed %d, %s\n", ret, snd_strerror(ret));
+      aerr("pcm writei/readi failed %d, %s\n", ret,
+           host_uninterruptible(snd_strerror, ret));
     }
 }
 
 static int sim_mixer_open(struct sim_audio_s *priv)
 {
   snd_mixer_selem_id_t *sid = NULL;
-  irqstate_t flags = up_irq_save();
   int ret;
 
-  ret = snd_mixer_open(&priv->mixer, 0);
+  ret = host_uninterruptible(snd_mixer_open, &priv->mixer, 0);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_mixer_attach(priv->mixer, "default");
+  ret = host_uninterruptible(snd_mixer_attach, priv->mixer, "default");
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_mixer_selem_register(priv->mixer, NULL, NULL);
+  ret = host_uninterruptible(snd_mixer_selem_register,
+                             priv->mixer, NULL, NULL);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_mixer_load(priv->mixer);
+  ret = host_uninterruptible(snd_mixer_load, priv->mixer);
   if (ret < 0)
     {
       goto fail;
     }
 
-  ret = snd_mixer_selem_id_malloc(&sid);
+  ret = host_uninterruptible(snd_mixer_selem_id_malloc, &sid);
   if (ret < 0)
     {
       goto fail;
@@ -1035,17 +1041,20 @@ static int sim_mixer_open(struct sim_audio_s *priv)
 
   if (priv->playback)
     {
-      snd_mixer_selem_id_set_index(sid, 0);
-      snd_mixer_selem_id_set_name(sid, "Master");
+      host_uninterruptible_no_return(snd_mixer_selem_id_set_index, sid, 0);
+      host_uninterruptible_no_return(snd_mixer_selem_id_set_name,
+                                     sid, "Master");
 
-      priv->volume = snd_mixer_find_selem(priv->mixer, sid);
-      snd_mixer_selem_id_free(sid);
+      priv->volume = host_uninterruptible(snd_mixer_find_selem,
+                                          priv->mixer, sid);
+      host_uninterruptible_no_return(snd_mixer_selem_id_free, sid);
       if (!priv->volume)
         {
           goto fail;
         }
 
-      ret = snd_mixer_selem_set_playback_volume_range(priv->volume, 0, 1000);
+      ret = host_uninterruptible(snd_mixer_selem_set_playback_volume_range,
+                                 priv->volume, 0, 1000);
       if (ret < 0)
         {
           goto fail;
@@ -1053,28 +1062,29 @@ static int sim_mixer_open(struct sim_audio_s *priv)
     }
   else
     {
-      snd_mixer_selem_id_set_index(sid, 0);
-      snd_mixer_selem_id_set_name(sid, "Capture");
+      host_uninterruptible_no_return(snd_mixer_selem_id_set_index, sid, 0);
+      host_uninterruptible_no_return(snd_mixer_selem_id_set_name,
+                                     sid, "Capture");
 
-      priv->volume = snd_mixer_find_selem(priv->mixer, sid);
-      snd_mixer_selem_id_free(sid);
+      priv->volume = host_uninterruptible(snd_mixer_find_selem,
+                                          priv->mixer, sid);
+      host_uninterruptible_no_return(snd_mixer_selem_id_free, sid);
       if (!priv->volume)
         {
           goto fail;
         }
 
-      ret = snd_mixer_selem_set_capture_volume_range(priv->volume, 0, 1000);
+      ret = host_uninterruptible(snd_mixer_selem_set_capture_volume_range,
+                                 priv->volume, 0, 1000);
       if (ret < 0)
         {
           goto fail;
         }
     }
 
-  up_irq_restore(flags);
   return 0;
 fail:
-  snd_mixer_close(priv->mixer);
-  up_irq_restore(flags);
+  host_uninterruptible(snd_mixer_close, priv->mixer);
   priv->mixer = NULL;
   return 0;
 }
diff --git a/arch/sim/src/sim/posix/sim_hostmemory.c 
b/arch/sim/src/sim/posix/sim_hostmemory.c
index 3ba3adb97e..cc651cb46e 100644
--- a/arch/sim/src/sim/posix/sim_hostmemory.c
+++ b/arch/sim/src/sim/posix/sim_hostmemory.c
@@ -52,9 +52,6 @@ static atomic_int g_uordblks;
  * Public Functions
  ****************************************************************************/
 
-extern uint64_t up_irq_save(void);
-extern void up_irq_restore(uint64_t flags);
-
 /****************************************************************************
  * Name: host_allocheap
  *
@@ -65,21 +62,19 @@ extern void up_irq_restore(uint64_t flags);
 
 void *host_allocheap(size_t sz)
 {
-  uint64_t flags = up_irq_save();
   void *p;
 
 #if defined(CONFIG_HOST_MACOS) && defined(CONFIG_HOST_ARM64)
   /* see: https://developer.apple.com/forums/thread/672804 */
 
-  p = mmap(NULL, sz, PROT_READ | PROT_WRITE,
-           MAP_ANON | MAP_SHARED, -1, 0);
+  p = host_uninterruptible(mmap, NULL, sz, PROT_READ | PROT_WRITE,
+                           MAP_ANON | MAP_SHARED, -1, 0);
 #else
-  p = mmap(NULL, sz, PROT_READ | PROT_WRITE | PROT_EXEC,
-           MAP_ANON | MAP_PRIVATE, -1, 0);
+  p = host_uninterruptible(mmap, NULL, sz,
+                           PROT_READ | PROT_WRITE | PROT_EXEC,
+                           MAP_ANON | MAP_PRIVATE, -1, 0);
 #endif
 
-  up_irq_restore(flags);
-
   if (p == MAP_FAILED)
     {
       return NULL;
@@ -98,14 +93,11 @@ void *host_allocheap(size_t sz)
 
 void host_freeheap(void *mem)
 {
-  uint64_t flags = up_irq_save();
-  munmap(mem, 0);
-  up_irq_restore(flags);
+  host_uninterruptible(munmap, mem, 0);
 }
 
 void *host_allocshmem(const char *name, size_t size, int master)
 {
-  uint64_t flags = up_irq_save();
   void *mem;
   int oflag;
   int ret;
@@ -117,10 +109,9 @@ void *host_allocshmem(const char *name, size_t size, int 
master)
       oflag |= O_CREAT | O_TRUNC;
     }
 
-  fd = shm_open(name, oflag, S_IRUSR | S_IWUSR);
+  fd = host_uninterruptible(shm_open, name, oflag, S_IRUSR | S_IWUSR);
   if (fd < 0)
     {
-      up_irq_restore(flags);
       return NULL;
     }
 
@@ -128,20 +119,19 @@ void *host_allocshmem(const char *name, size_t size, int 
master)
     {
       /* Avoid the second slave instance open successfully */
 
-      shm_unlink(name);
+      host_uninterruptible(shm_unlink, name);
     }
 
-  ret = ftruncate(fd, size);
+  ret = host_uninterruptible(ftruncate, fd, size);
   if (ret < 0)
     {
-      up_irq_restore(flags);
-      close(fd);
+      host_uninterruptible(close, fd);
       return NULL;
     }
 
-  mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-  close(fd); /* Don't need keep fd any more once the memory get mapped */
-  up_irq_restore(flags);
+  mem = host_uninterruptible(mmap, NULL, size,
+                             PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+  host_uninterruptible(close, fd); /* Don't need keep fd any more once the 
memory get mapped */
   if (mem == MAP_FAILED)
     {
       return NULL;
@@ -152,23 +142,20 @@ void *host_allocshmem(const char *name, size_t size, int 
master)
 
 void host_freeshmem(void *mem)
 {
-  uint64_t flags = up_irq_save();
-  munmap(mem, 0);
-  up_irq_restore(flags);
+  host_uninterruptible(munmap, mem, 0);
 }
 
 size_t host_mallocsize(void *mem)
 {
 #ifdef __APPLE__
-  return malloc_size(mem);
+  return host_uninterruptible(malloc_size, mem);
 #else
-  return malloc_usable_size(mem);
+  return host_uninterruptible(malloc_usable_size, mem);
 #endif
 }
 
 void *host_memalign(size_t alignment, size_t size)
 {
-  uint64_t flags = up_irq_save();
   void *p;
   int error;
 
@@ -177,18 +164,15 @@ void *host_memalign(size_t alignment, size_t size)
       alignment = sizeof(void *);
     }
 
-  error = posix_memalign(&p, alignment, size);
+  error = host_uninterruptible(posix_memalign, &p, alignment, size);
   if (error != 0)
     {
-      up_irq_restore(flags);
       return NULL;
     }
 
   size = host_mallocsize(p);
-  g_aordblks += 1;
-  g_uordblks += size;
-
-  up_irq_restore(flags);
+  atomic_fetch_add(&g_aordblks, 1);
+  atomic_fetch_add(&g_uordblks, size);
 
   return p;
 }
@@ -196,24 +180,20 @@ void *host_memalign(size_t alignment, size_t size)
 void host_free(void *mem)
 {
   size_t size;
-  uint64_t flags;
 
   if (mem == NULL)
     {
       return;
     }
 
-  flags = up_irq_save();
   size = host_mallocsize(mem);
-  g_aordblks -= 1;
-  g_uordblks -= size;
-  free(mem);
-  up_irq_restore(flags);
+  atomic_fetch_sub(&g_aordblks, 1);
+  atomic_fetch_sub(&g_uordblks, size);
+  host_uninterruptible_no_return(free, mem);
 }
 
 void *host_realloc(void *oldmem, size_t size)
 {
-  uint64_t flags;
   size_t oldsize;
   void *mem;
 
@@ -222,27 +202,21 @@ void *host_realloc(void *oldmem, size_t size)
       return host_memalign(sizeof(void *), size);
     }
 
-  flags = up_irq_save();
-
   oldsize = host_mallocsize(oldmem);
-  mem = realloc(oldmem, size);
+  mem = host_uninterruptible(realloc, oldmem, size);
   if (mem == NULL)
     {
-      up_irq_restore(flags);
       return NULL;
     }
 
   size = host_mallocsize(mem);
-  g_uordblks -= oldsize;
-  g_uordblks += size;
-
-  up_irq_restore(flags);
+  atomic_fetch_add(&g_uordblks, size - oldsize);
 
   return mem;
 }
 
 void host_mallinfo(int *aordblks, int *uordblks)
 {
-  *aordblks = g_aordblks;
-  *uordblks = g_uordblks;
+  *aordblks = atomic_load(&g_aordblks);
+  *uordblks = atomic_load(&g_uordblks);
 }
diff --git a/arch/sim/src/sim/posix/sim_hostmisc.c 
b/arch/sim/src/sim/posix/sim_hostmisc.c
index b23403c24c..a1856b8d47 100644
--- a/arch/sim/src/sim/posix/sim_hostmisc.c
+++ b/arch/sim/src/sim/posix/sim_hostmisc.c
@@ -52,8 +52,6 @@ void __gcov_dump(void);
  * Public Functions
  ****************************************************************************/
 
-extern uint64_t up_irq_save(void);
-extern void up_irq_restore(uint64_t flags);
 extern int backtrace(void **array, int size);
 
 /****************************************************************************
@@ -68,19 +66,15 @@ extern int backtrace(void **array, int size);
 
 void host_abort(int status)
 {
-  uint64_t flags = up_irq_save();
-
 #ifdef CONFIG_ARCH_COVERAGE
   /* Dump gcov data. */
 
-  __gcov_dump();
+  host_uninterruptible_no_return(__gcov_dump);
 #endif
 
   /* exit the simulation */
 
-  exit(status);
-
-  up_irq_restore(flags);
+  host_uninterruptible_no_return(exit, status);
 }
 
 /****************************************************************************
@@ -99,13 +93,7 @@ int host_backtrace(void** array, int size)
 #ifdef CONFIG_WINDOWS_CYGWIN
   return 0;
 #else
-  uint64_t flags = up_irq_save();
-  int ret;
-
-  ret = backtrace(array, size);
-
-  up_irq_restore(flags);
-  return ret;
+  return host_uninterruptible(backtrace, array, size);
 #endif
 }
 
@@ -130,7 +118,6 @@ int host_system(char *buf, size_t len, const char *fmt, ...)
 {
   FILE *fp;
   int ret;
-  uint64_t flags;
   char cmd[512];
   va_list vars;
 
@@ -144,21 +131,18 @@ int host_system(char *buf, size_t len, const char *fmt, 
...)
 
   if (buf == NULL)
     {
-      ret = system(cmd);
+      ret = host_uninterruptible(system, cmd);
     }
   else
     {
-      flags = up_irq_save();
-      fp = popen(cmd, "r");
+      fp = host_uninterruptible(popen, cmd, "r");
       if (fp == NULL)
         {
-          up_irq_restore(flags);
           return -errno;
         }
 
-      ret = fread(buf, sizeof(char), len, fp);
-      pclose(fp);
-      up_irq_restore(flags);
+      ret = host_uninterruptible(fread, buf, 1, len, fp);
+      host_uninterruptible(pclose, fp);
     }
 
   return ret < 0 ? -errno : ret;
@@ -178,10 +162,10 @@ void host_init_cwd(void)
   /* Get the absolute path of the executable file */
 
 #  ifdef CONFIG_HOST_LINUX
-  len = readlink("/proc/self/exe", path, len);
+  len = host_uninterruptible(readlink, "/proc/self/exe", path, len);
   if (len < 0)
     {
-      perror("readlink  failed");
+      host_uninterruptible_no_return(perror, "readlink failed");
       return;
     }
 #  else
@@ -195,7 +179,7 @@ void host_init_cwd(void)
   path[len] = '\0';
   name = strrchr(path, '/');
   *++name = '\0';
-  chdir(path);
+  host_uninterruptible(chdir, path);
 }
 #endif
 
@@ -218,7 +202,8 @@ pid_t host_posix_spawn(const char *path,
       argv = default_argv;
     }
 
-  ret = posix_spawn(&pid, path, NULL, NULL, argv, envp);
+  ret = host_uninterruptible(posix_spawn, &pid, path,
+                             NULL, NULL, argv, envp);
   return ret > 0 ? -ret : pid;
 }
 
@@ -230,6 +215,6 @@ int host_waitpid(pid_t pid)
 {
   int status;
 
-  pid = waitpid(pid, &status, 0);
+  pid = host_uninterruptible(waitpid, pid, &status, 0);
   return pid < 0 ? -errno : status;
 }
diff --git a/arch/sim/src/sim/sim_internal.h b/arch/sim/src/sim/sim_internal.h
index c62b78d538..0364514614 100644
--- a/arch/sim/src/sim/sim_internal.h
+++ b/arch/sim/src/sim/sim_internal.h
@@ -120,6 +120,27 @@
       }                                                         \
     while (0)
 
+#define host_uninterruptible(func, ...)                         \
+    ({                                                          \
+        extern uint64_t up_irq_save(void);                      \
+        extern void up_irq_restore(uint64_t flags);             \
+        uint64_t flags_ = up_irq_save();                        \
+        typeof(func(__VA_ARGS__)) ret_ = func(__VA_ARGS__);     \
+        up_irq_restore(flags_);                                 \
+        ret_;                                                   \
+    })
+
+#define host_uninterruptible_no_return(func, ...)               \
+    do                                                          \
+      {                                                         \
+        extern uint64_t up_irq_save(void);                      \
+        extern void up_irq_restore(uint64_t flags);             \
+        uint64_t flags_ = up_irq_save();                        \
+        func(__VA_ARGS__);                                      \
+        up_irq_restore(flags_);                                 \
+      }                                                         \
+    while (0)
+
 /* File System Definitions **************************************************/
 
 /* These definitions characterize the compressed filesystem image */

Reply via email to