SHMEM: Fix Linux code to properly use built-in's and cleanup on shutdown

As reported in #909
This commit is contained in:
Mark Pizzolato 2020-07-08 12:38:10 -07:00
parent 4ab34c58af
commit 6c08fae048

View file

@ -569,7 +569,7 @@ struct SHMEM {
t_stat sim_shmem_open (const char *name, size_t size, SHMEM **shmem, void **addr) t_stat sim_shmem_open (const char *name, size_t size, SHMEM **shmem, void **addr)
{ {
#ifdef HAVE_SHM_OPEN #if defined (HAVE_SHM_OPEN) && defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
*shmem = (SHMEM *)calloc (1, sizeof(**shmem)); *shmem = (SHMEM *)calloc (1, sizeof(**shmem));
mode_t orig_mask; mode_t orig_mask;
@ -636,15 +636,17 @@ if (shmem == NULL)
return; return;
if (shmem->shm_base != MAP_FAILED) if (shmem->shm_base != MAP_FAILED)
munmap (shmem->shm_base, shmem->shm_size); munmap (shmem->shm_base, shmem->shm_size);
if (shmem->shm_fd != -1) if (shmem->shm_fd != -1) {
shm_unlink (shmem->shm_name);
close (shmem->shm_fd); close (shmem->shm_fd);
}
free (shmem->shm_name); free (shmem->shm_name);
free (shmem); free (shmem);
} }
int32 sim_shmem_atomic_add (int32 *p, int32 v) int32 sim_shmem_atomic_add (int32 *p, int32 v)
{ {
#if defined (HAVE_GCC_SYNC_BUILTINS) #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
return __sync_add_and_fetch((int *) p, v); return __sync_add_and_fetch((int *) p, v);
#else #else
return *p + v; return *p + v;
@ -653,7 +655,7 @@ return *p + v;
t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv) t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv)
{ {
#if defined (HAVE_GCC_SYNC_BUILTINS) #if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
return __sync_bool_compare_and_swap (ptr, oldv, newv); return __sync_bool_compare_and_swap (ptr, oldv, newv);
#else #else
if (*ptr == oldv) { if (*ptr == oldv) {