Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
activity_channel.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <array>
7#include <atomic>
8#include <cstddef>
9#include <cstdint>
10#include <memory>
11
12namespace pulp::runtime {
13
31template <std::size_t LaneCount>
33 static_assert(LaneCount > 0, "ActivityChannel must have at least one lane");
34 static_assert(std::atomic<std::uint32_t>::is_always_lock_free,
35 "ActivityChannel requires lock-free 32-bit atomics");
36
37public:
38 using Sequence = std::uint32_t;
39
40 static constexpr std::size_t lane_count() noexcept { return LaneCount; }
41
44 void signal(std::size_t lane) noexcept {
45 if (lane >= LaneCount) return;
46 sequences_[lane].fetch_add(1, std::memory_order_relaxed);
47 }
48
50 Sequence sequence(std::size_t lane) const noexcept {
51 if (lane >= LaneCount) return 0;
52 return sequences_[lane].load(std::memory_order_relaxed);
53 }
54
59 bool consume(std::size_t lane, Sequence& cursor) const noexcept {
60 return consume_count(lane, cursor) != 0;
61 }
62
66 Sequence consume_count(std::size_t lane, Sequence& cursor) const noexcept {
67 if (lane >= LaneCount) return 0;
68 const Sequence current = sequence(lane);
69 const Sequence count = current - cursor;
70 cursor = current;
71 return count;
72 }
73
74private:
75 std::array<std::atomic<Sequence>, LaneCount> sequences_{};
76};
77
78template <std::size_t LaneCount>
79using SharedActivityChannel = std::shared_ptr<ActivityChannel<LaneCount>>;
80
81template <std::size_t LaneCount>
83 return std::make_shared<ActivityChannel<LaneCount>>();
84}
85
86} // namespace pulp::runtime
A fixed set of lock-free occurrence counters.
Definition activity_channel.hpp:32
Sequence consume_count(std::size_t lane, Sequence &cursor) const noexcept
Return the number of signals since cursor and advance it to the newest sequence.
Definition activity_channel.hpp:66
void signal(std::size_t lane) noexcept
Record activity on lane.
Definition activity_channel.hpp:44
Sequence sequence(std::size_t lane) const noexcept
Read the current sequence for lane. Invalid lanes read as zero.
Definition activity_channel.hpp:50
bool consume(std::size_t lane, Sequence &cursor) const noexcept
Return true once when activity has occurred since cursor was last consumed, updating the cursor to th...
Definition activity_channel.hpp:59
static constexpr std::size_t lane_count() noexcept
Definition activity_channel.hpp:40
std::uint32_t Sequence
Definition activity_channel.hpp:38
Definition generated_event_source.hpp:33
std::shared_ptr< ActivityChannel< LaneCount > > SharedActivityChannel
Definition activity_channel.hpp:79
SharedActivityChannel< LaneCount > make_activity_channel()
Definition activity_channel.hpp:82