Skip to content

Commit

Permalink
Fix Microsoft atomics
Browse files Browse the repository at this point in the history
  • Loading branch information
RobDangerous committed Feb 23, 2025
1 parent df12685 commit fa1a774
Showing 1 changed file with 7 additions and 21 deletions.
28 changes: 7 additions & 21 deletions backends/system/microsoft/includes/kore3/backend/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,48 +6,34 @@

#include <intrin.h>

static inline bool kinc_atomic_compare_exchange(volatile int32_t *pointer, int32_t old_value, int32_t new_value) {
static inline bool kore_atomic_compare_exchange(volatile int32_t *pointer, int32_t old_value, int32_t new_value) {
return _InterlockedCompareExchange((volatile long *)pointer, new_value, old_value) == old_value;
}

#define KINC_ATOMIC_COMPARE_EXCHANGE(pointer, oldValue, newValue) (kinc_atomic_compare_exchange(pointer, oldValue, newValue))

static inline bool kinc_atomic_compare_exchange_pointer(void *volatile *pointer, void *old_value, void *new_value) {
static inline bool kore_atomic_compare_exchange_pointer(void *volatile *pointer, void *old_value, void *new_value) {
return _InterlockedCompareExchangePointer(pointer, new_value, old_value) == old_value;
}

#define KINC_ATOMIC_COMPARE_EXCHANGE_POINTER(pointer, oldValue, newValue) (kinc_atomic_compare_exchange_pointer(pointer, oldValue, newValue))

static inline int32_t kinc_atomic_increment(volatile int32_t *pointer) {
static inline int32_t kore_atomic_increment(volatile int32_t *pointer) {
return _InterlockedIncrement((volatile long *)pointer) - 1;
}

#define KINC_ATOMIC_INCREMENT(pointer) (kinc_atomic_increment(pointer))

static inline int32_t kinc_atomic_decrement(volatile int32_t *pointer) {
static inline int32_t kore_atomic_decrement(volatile int32_t *pointer) {
return _InterlockedDecrement((volatile long *)pointer) + 1;
}

#define KINC_ATOMIC_DECREMENT(pointer) (kinc_atomic_decrement(pointer))

static inline void kinc_atomic_exchange(volatile int32_t *pointer, int32_t value) {
static inline void kore_atomic_exchange(volatile int32_t *pointer, int32_t value) {
_InterlockedExchange((volatile long *)pointer, value);
}

#define KINC_ATOMIC_EXCHANGE_32(pointer, value) (kinc_atomic_exchange(pointer, value))

static inline void kinc_atomic_exchange_float(volatile float *pointer, float value) {
static inline void kore_atomic_exchange_float(volatile float *pointer, float value) {
_InterlockedExchange((volatile long *)pointer, *(long *)&value);
}

#define KINC_ATOMIC_EXCHANGE_FLOAT(pointer, value) (kinc_atomic_exchange_float(pointer, value))

static inline void kinc_atomic_exchange_double(volatile double *pointer, double value) {
static inline void kore_atomic_exchange_double(volatile double *pointer, double value) {
#ifdef _WIN64
_InterlockedExchange64((volatile __int64 *)pointer, *(__int64 *)&value);
#else
kinc_error_message("kinc_atomic_exchange_double is not supported for 32 bit Windows builds");
#endif
}

#define KINC_ATOMIC_EXCHANGE_DOUBLE(pointer, value) (kinc_atomic_exchange_double(pointer, value))

0 comments on commit fa1a774

Please sign in to comment.