/* update the reader index to be the prior qp */
tmp = lock->current_alloc_idx;
+# if (defined(NO_INTERLOCKEDOR64))
+ CRYPTO_THREAD_write_lock(lock->rw_lock);
+ lock->reader_idx = tmp;
+ CRYPTO_THREAD_unlock(lock->rw_lock);
+# else
InterlockedExchange((LONG volatile *)&lock->reader_idx, tmp);
+# endif
/* wake up any waiters */
ossl_crypto_condvar_broadcast(lock->alloc_signal);
int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock)
{
+# if (defined(NO_INTERLOCKEDOR64))
+ if (lock == NULL || !CRYPTO_THREAD_write_lock(lock))
+ return 0;
+ *val += amount;
+ *ret = *val;
+
+ if (!CRYPTO_THREAD_unlock(lock))
+ return 0;
+
+ return 1;
+# else
*ret = (int)InterlockedExchangeAdd((LONG volatile *)val, (LONG)amount)
+ amount;
return 1;
+# endif
}
int CRYPTO_atomic_add64(uint64_t *val, uint64_t op, uint64_t *ret,