Brian Silverman | eda63f3 | 2017-10-08 18:57:33 -0400 | [diff] [blame] | 1 | #include "motors/usb/queue.h" |
| 2 | |
| 3 | #include <string.h> |
| 4 | |
| 5 | namespace frc971 { |
| 6 | namespace teensy { |
| 7 | |
| 8 | size_t Queue::Read(char *out_data, size_t out_size) { |
| 9 | const size_t read_cursor = read_cursor_.load(::std::memory_order_relaxed); |
| 10 | const size_t write_cursor = write_cursor_.load(::std::memory_order_acquire); |
| 11 | const size_t r = ::std::min(out_size, space_used(read_cursor, write_cursor)); |
| 12 | const size_t first_chunk = ::std::min(r, size_ - read_cursor); |
| 13 | memcpy(out_data, &data_[read_cursor], first_chunk); |
| 14 | memcpy(out_data + first_chunk, &data_[0], r - first_chunk); |
| 15 | read_cursor_.store(wrap(read_cursor + r), ::std::memory_order_release); |
| 16 | return r; |
| 17 | } |
| 18 | |
| 19 | size_t Queue::Write(const char *in_data, size_t in_size) { |
| 20 | const size_t write_cursor = write_cursor_.load(::std::memory_order_relaxed); |
| 21 | const size_t read_cursor = read_cursor_.load(::std::memory_order_acquire); |
| 22 | const size_t r = |
| 23 | ::std::min(in_size, size_ - space_used(read_cursor, write_cursor) - 1); |
| 24 | const size_t first_chunk = ::std::min(r, size_ - write_cursor); |
| 25 | memcpy(&data_[write_cursor], in_data, first_chunk); |
| 26 | memcpy(&data_[0], in_data + first_chunk, r - first_chunk); |
| 27 | write_cursor_.store(wrap(write_cursor + r), ::std::memory_order_release); |
| 28 | return r; |
| 29 | } |
| 30 | |
| 31 | } // namespace teensy |
| 32 | } // namespace frc971 |