From c1f249ec661882dbd4258895eed9c7d2bf94aa51 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 1 Jun 2018 23:16:14 -0700 Subject: [PATCH] SCP: Add atomic routines for temporary shmem access --- sim_fio.c | 20 ++++++++++++++++++++ sim_fio.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/sim_fio.c b/sim_fio.c index 1446f225..894f5e17 100644 --- a/sim_fio.c +++ b/sim_fio.c @@ -458,6 +458,16 @@ if (shmem->hMapping != INVALID_HANDLE_VALUE) free (shmem); } +int32 sim_shmem_atomic_add (int32 *p, int32 v) +{ +return InterlockedExchangeAdd ((volatile long *) p,v) + (v); +} + +t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv) +{ +return (InterlockedCompareExchange ((LONG volatile *) ptr, newv, oldv) == oldv); +} + #else /* !defined(_WIN32) */ #include int sim_set_fsize (FILE *fptr, t_addr size) @@ -604,6 +614,16 @@ if (shmem->shm_fd != -1) free (shmem); } +int32 sim_shmem_atomic_add (int32 *p, int32 v) +{ +return __sync_add_and_fetch((int *) p, v); +} + +t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv) +{ +return __sync_bool_compare_and_swap (ptr, oldv, newv); +} + #endif #if defined(__VAX) diff --git a/sim_fio.h b/sim_fio.h index 7d7feca2..5f3b0e74 100644 --- a/sim_fio.h +++ b/sim_fio.h @@ -76,6 +76,8 @@ const char *sim_get_os_error_text (int error); typedef struct SHMEM SHMEM; t_stat sim_shmem_open (const char *name, size_t size, SHMEM **shmem, void **addr); void sim_shmem_close (SHMEM *shmem); +int32 sim_shmem_atomic_add (int32 *ptr, int32 val); +t_bool sim_shmem_atomic_cas (int32 *ptr, int32 oldv, int32 newv); extern t_bool sim_taddr_64; /* t_addr is > 32b and Large File Support available */ extern t_bool sim_toffset_64; /* Large File (>2GB) file I/O support */