SHMEM: Fix Linux code to properly use built-in's and cleanup on shutdown
As reported in #909
This commit is contained in:
parent
4ab34c58af
commit
6c08fae048
1 changed files with 6 additions and 4 deletions
10
sim_fio.c
10
sim_fio.c
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue