| 69 | |
| 70 | template <fl::size DescriptorCount, fl::size ArenaSize> |
| 71 | void AsyncLogQueue<DescriptorCount, ArenaSize>::commit() { |
| 72 | fl::u32 tail = mTail; |
| 73 | const Descriptor& desc = mDescriptors[tail]; |
| 74 | |
| 75 | // Free arena space by advancing arena tail |
| 76 | fl::u32 newArenaTail = (mArenaTail + desc.mLength) & (ArenaSize - 1); |
| 77 | |
| 78 | { |
| 79 | fl::isr::critical_section cs; // Protect arena tail update |
| 80 | mArenaTail = newArenaTail; |
| 81 | } |
| 82 | |
| 83 | // Clear descriptor (optional, for debugging/sentinel semantics) |
| 84 | mDescriptors[tail] = Descriptor(); |
| 85 | |
| 86 | // Advance tail (consumer publishes completion) |
| 87 | fl::u32 newTail = (tail + 1) & (DescriptorCount - 1); |
| 88 | |
| 89 | { |
| 90 | fl::isr::critical_section cs; // Protect tail update |
| 91 | mTail = newTail; |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | template <fl::size DescriptorCount, fl::size ArenaSize> |
| 96 | fl::u32 AsyncLogQueue<DescriptorCount, ArenaSize>::droppedCount() const { |