22#include "pw_assert/assert.h"
23#include "pw_clock_tree/internal/deferred_init.h"
24#include "pw_status/status.h"
25#include "pw_status/try.h"
26#include "pw_sync/interrupt_spin_lock.h"
27#include "pw_sync/mutex.h"
130 uint32_t
IncRef() {
return ++ref_count_; }
134 PW_ASSERT(ref_count_ > 0);
149 uint32_t ref_count_ = 0;
152 const bool may_block_;
165 static constexpr bool kMayBlock =
true;
166 static constexpr bool kMayFail =
true;
175 internal::DeferredInit<sync::Mutex> mutex_;
178 std::lock_guard lock(this->lock());
182 std::lock_guard lock(this->lock());
191 static constexpr bool kMayBlock =
false;
192 static constexpr bool kMayFail =
true;
202 std::lock_guard lock(this->lock());
206 std::lock_guard lock(this->lock());
215 static constexpr bool kMayFail =
false;
240template <
typename ElementType>
247 if (this->IncRef() > 1) {
253 Status status = this->DoEnable();
264 if (this->DecRef() > 0) {
270 Status status = this->DoDisable();
301template <
typename ElementType>
314 if (this->IncRef() > 1) {
326 Status status = this->DoEnable();
340 if (this->DecRef() > 0) {
346 if (
Status status = this->DoDisable(); !status.
ok()) {
388 [[deprecated(
"Use SetDivider()")]]
389 Status Set(uint32_t divider) {
400 virtual Status DoSetDivider(uint32_t divider) = 0;
415template <
typename ElementType>
431 template <
typename T = ElementType>
432 typename std::enable_if_t<T::kMayFail, pw::Status>
SetDivider(
442 template <
typename T = ElementType>
456 std::lock_guard lock(this->lock());
457 return DoSetDividerLocked(
divider);
461 uint32_t old_divider = divider_;
463 if (this->ref_count() == 0) {
467 Status status = this->DoEnable();
470 divider_ = old_divider;
496 : element_(element) {}
506 if (element_ !=
nullptr) {
517 if (element_ !=
nullptr) {
constexpr bool ok() const
Definition: status.h:346
constexpr void IgnoreError() const
Definition: status.h:430
Definition: clock_tree.h:417
std::enable_if_t<!T::kMayFail, void > SetDivider(uint32_t divider)
Definition: clock_tree.h:443
Definition: clock_tree.h:374
Definition: clock_tree.h:241
Definition: clock_tree.h:281
Definition: clock_tree.h:302
Definition: clock_tree.h:163
Definition: clock_tree.h:45
Definition: clock_tree.h:213
Definition: clock_tree.h:189
Definition: clock_tree.h:493
Definition: interrupt_spin_lock.h:50
Status SetDivider(uint32_t divider)
Definition: clock_tree.h:385
void Release()
Release a reference to this clock tree element.
Definition: clock_tree.h:221
void Acquire()
Acquire a reference to this clock tree element.
Definition: clock_tree.h:218
Status Acquire()
Definition: clock_tree.h:505
Status DoAcquireLocked() final
Definition: clock_tree.h:246
std::enable_if_t< T::kMayFail, pw::Status > SetDivider(uint32_t divider)
Definition: clock_tree.h:432
virtual Status DoAcquireLocked()=0
Status Release()
Definition: clock_tree.h:76
Status DoRelease() final
Handle Release(), deferring locking the child class.
Definition: clock_tree.h:181
virtual Status DoReleaseLocked()=0
Status Acquire()
Definition: clock_tree.h:68
Element & element() const
Return the element implementing this interface.
Definition: clock_tree.h:394
Status DoReleaseLocked() final
Definition: clock_tree.h:263
virtual Status DoEnable()=0
Function called when the clock tree element needs to get enabled.
Status DoAcquire() final
Handle Acquire(), deferring locking the child class.
Definition: clock_tree.h:177
uint32_t IncRef()
Increment reference count and return incremented value.
Definition: clock_tree.h:130
pw::Status DoEnable() final
Function called when the clock tree element needs to get enabled.
Definition: clock_tree.h:283
Status DoAcquire() final
Handle Acquire(), deferring locking the child class.
Definition: clock_tree.h:201
uint32_t divider() const
Get current divider value.
Definition: clock_tree.h:449
bool may_block() const
Check whether acquiring or releasing the element may block.
Definition: clock_tree.h:54
constexpr ClockDividerElement(ElementType &source, uint32_t divider)
Definition: clock_tree.h:421
Status DoRelease() final
Handle Release(), deferring locking the child class.
Definition: clock_tree.h:205
constexpr DependentElement(ElementType &source)
Create a dependent clock tree element that depends on source.
Definition: clock_tree.h:305
virtual Status DoAcquire()=0
Handle Acquire(), deferring locking the child class.
uint32_t ref_count() const
Get reference count for this clock tree element.
Definition: clock_tree.h:51
pw::Status DoDisable() final
Definition: clock_tree.h:285
Status Release()
Definition: clock_tree.h:516
uint32_t DecRef()
Decrement reference count and return decremented value.
Definition: clock_tree.h:133
virtual Status DoRelease()=0
Handle Release(), deferring locking the child class.
Status DoAcquireLocked() final
Definition: clock_tree.h:313
Status AcquireWith(Element &element_with)
Definition: clock_tree.h:89
Status DoReleaseLocked() final
Definition: clock_tree.h:339
virtual Status DoDisable()
Definition: clock_tree.h:145
#define PW_TRY(expr)
Returns early if expr is a non-OK Status or Result.
Definition: try.h:27
constexpr Status OkStatus()
Definition: status.h:450
Clock tree management library.
Definition: clock_tree.h:30