diff options
Diffstat (limited to 'tmk_core/ring_buffer.h')
| -rw-r--r-- | tmk_core/ring_buffer.h | 26 | 
1 files changed, 12 insertions, 14 deletions
| diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h index 7bdebbcf34..005d1be613 100644 --- a/tmk_core/ring_buffer.h +++ b/tmk_core/ring_buffer.h @@ -4,13 +4,13 @@   * Ring buffer to store scan codes from keyboard   *------------------------------------------------------------------*/  #define RBUF_SIZE 32 +#include <util/atomic.h>  static uint8_t rbuf[RBUF_SIZE];  static uint8_t rbuf_head = 0;  static uint8_t rbuf_tail = 0;  static inline void rbuf_enqueue(uint8_t data)  { -    uint8_t sreg = SREG; -    cli(); +  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {      uint8_t next = (rbuf_head + 1) % RBUF_SIZE;      if (next != rbuf_tail) {          rbuf[rbuf_head] = data; @@ -18,36 +18,34 @@ static inline void rbuf_enqueue(uint8_t data)      } else {          print("rbuf: full\n");      } -    SREG = sreg; +  }  }  static inline uint8_t rbuf_dequeue(void)  {      uint8_t val = 0; +  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { -    uint8_t sreg = SREG; -    cli();      if (rbuf_head != rbuf_tail) {          val = rbuf[rbuf_tail];          rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;      } -    SREG = sreg; +  }      return val;  }  static inline bool rbuf_has_data(void)  { -    uint8_t sreg = SREG; -    cli(); -    bool has_data = (rbuf_head != rbuf_tail); -    SREG = sreg; -    return has_data; +  bool has_data; +  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { +    has_data = (rbuf_head != rbuf_tail); +  } +  return has_data;  }  static inline void rbuf_clear(void)  { -    uint8_t sreg = SREG; -    cli(); +  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {      rbuf_head = rbuf_tail = 0; -    SREG = sreg; +  }  }  #endif  /* RING_BUFFER_H */ | 
