#ifndef WIFI_ATOMIC_H_ #define WIFI_ATOMIC_H_ #include "util.h" static inline void __atomic_bit_clear(uint8_t *d, const uint8_t bit) { *d &= ~(1 << bit); } static inline void atomic_bit_clear(uint8_t *d, const uint8_t bit) { uint8_t sreg = irq_disable_save(); __atomic_bit_clear(d, bit); irq_restore(sreg); } static inline void __atomic_bit_set(uint8_t *d, const uint8_t bit) { *d |= (1 << bit); } static inline void atomic_bit_set(uint8_t *d, const uint8_t bit) { uint8_t sreg = irq_disable_save(); __atomic_bit_set(d, bit); irq_restore(sreg); } static inline void __atomic_bit_flip(uint8_t *d, const uint8_t bit) { *d ^= (1 << bit); } static inline void atomic_bit_flip(uint8_t *d, const uint8_t bit) { uint8_t sreg = irq_disable_save(); __atomic_bit_flip(d, bit); irq_restore(sreg); } static inline bool __atomic_bit_test(const uint8_t *d, const uint8_t bit) { return !!(*d & (1 << bit)); } static inline bool atomic_bit_test(const uint8_t *d, const uint8_t bit) { /* Reading an 8bit value from SRAM is atomic. * No need to disable IRQs. */ return __atomic_bit_test(d, bit); } static inline bool atomic_bit_test_and_clear(uint8_t *d, const uint8_t bit) { uint8_t sreg; bool result; sreg = irq_disable_save(); result = __atomic_bit_test(d, bit); __atomic_bit_clear(d, bit); irq_restore(sreg); return result; } #endif /* WIFI_ATOMIC_H_ */