diff options
author | xyverz <xyverz@gmail.com> | 2016-12-06 17:36:19 -0800 |
---|---|---|
committer | xyverz <xyverz@gmail.com> | 2016-12-06 17:36:19 -0800 |
commit | 9216bc73778ef0fe5830b91511f37dd90fb0f0a1 (patch) | |
tree | 6c9f343c2485150c1912b7b68ade364a232015bd /tmk_core/ring_buffer.h | |
parent | f9cf4f75aec8cb24f054f243b985d9e5c18a2a80 (diff) | |
parent | 985a091a739c99736d5b17de5161831488dbc219 (diff) |
Merge remote-tracking branch 'upstream/master'
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 */ |