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();
311template <
typename ElementType>
324 if (this->IncRef() > 1) {
336 Status status = this->DoEnable();
350 if (this->DecRef() > 0) {
356 if (
Status status = this->DoDisable(); !status.
ok()) {
404 virtual Status DoSetDivider(uint32_t divider) = 0;
419template <
typename ElementType>
435 template <
typename T = ElementType>
436 typename std::enable_if_t<T::kMayFail, pw::Status>
SetDivider(
446 template <
typename T = ElementType>
460 std::lock_guard lock(this->lock());
461 return DoSetDividerLocked(
divider);
465 uint32_t old_divider = divider_;
467 if (this->ref_count() == 0) {
471 Status status = this->DoEnable();
474 divider_ = old_divider;
500 : element_(element) {}
510 if (element_ !=
nullptr) {
521 if (element_ !=
nullptr) {
constexpr bool ok() const
Definition: status.h:346
constexpr void IgnoreError() const
Definition: status.h:430
Definition: clock_tree.h:421
std::enable_if_t<!T::kMayFail, void > SetDivider(uint32_t divider)
Definition: clock_tree.h:447
Definition: clock_tree.h:384
Definition: clock_tree.h:241
Definition: clock_tree.h:291
Definition: clock_tree.h:281
Definition: clock_tree.h:312
Definition: clock_tree.h:163
Definition: clock_tree.h:45
Definition: clock_tree.h:213
Definition: clock_tree.h:189
Definition: clock_tree.h:497
Definition: interrupt_spin_lock.h:50
Status SetDivider(uint32_t divider)
Definition: clock_tree.h:395
pw::Status DoEnable() final
Function called when the clock tree element needs to get enabled.
Definition: clock_tree.h:293
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
pw::Status DoDisable() final
Definition: clock_tree.h:295
Status Acquire()
Definition: clock_tree.h:509
Status DoAcquireLocked() final
Definition: clock_tree.h:246
std::enable_if_t< T::kMayFail, pw::Status > SetDivider(uint32_t divider)
Definition: clock_tree.h:436
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:398
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:453
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:425
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:315
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:520
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:323
Status AcquireWith(Element &element_with)
Definition: clock_tree.h:89
Status DoReleaseLocked() final
Definition: clock_tree.h:349
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