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_; }
133 uint32_t
DecRef() {
return --ref_count_; }
146 uint32_t ref_count_ = 0;
149 const bool may_block_;
162 static constexpr bool kMayBlock =
true;
163 static constexpr bool kMayFail =
true;
172 internal::DeferredInit<sync::Mutex> mutex_;
175 std::lock_guard lock(this->lock());
179 std::lock_guard lock(this->lock());
188 static constexpr bool kMayBlock =
false;
189 static constexpr bool kMayFail =
true;
199 std::lock_guard lock(this->lock());
203 std::lock_guard lock(this->lock());
212 static constexpr bool kMayFail =
false;
237template <
typename ElementType>
244 if (this->IncRef() > 1) {
250 Status status = this->DoEnable();
261 if (this->DecRef() > 0) {
267 Status status = this->DoDisable();
298template <
typename ElementType>
311 if (this->IncRef() > 1) {
323 Status status = this->DoEnable();
337 if (this->DecRef() > 0) {
343 if (
Status status = this->DoDisable(); !status.
ok()) {
385 [[deprecated(
"Use SetDivider()")]]
386 Status Set(uint32_t divider) {
397 virtual Status DoSetDivider(uint32_t divider) = 0;
412template <
typename ElementType>
428 template <
typename T = ElementType>
429 typename std::enable_if_t<T::kMayFail, pw::Status>
SetDivider(
439 template <
typename T = ElementType>
453 std::lock_guard lock(this->lock());
454 return DoSetDividerLocked(
divider);
458 uint32_t old_divider = divider_;
460 if (this->ref_count() == 0) {
464 Status status = this->DoEnable();
467 divider_ = old_divider;
493 : element_(element) {}
503 if (element_ !=
nullptr) {
514 if (element_ !=
nullptr) {
constexpr bool ok() const
Definition: status.h:158
constexpr void IgnoreError() const
Definition: status.h:223
Definition: clock_tree.h:414
std::enable_if_t<!T::kMayFail, void > SetDivider(uint32_t divider)
Definition: clock_tree.h:440
Definition: clock_tree.h:371
Definition: clock_tree.h:238
Definition: clock_tree.h:278
Definition: clock_tree.h:299
Definition: clock_tree.h:160
Definition: clock_tree.h:45
Definition: clock_tree.h:210
Definition: clock_tree.h:186
Definition: clock_tree.h:490
Definition: interrupt_spin_lock.h:50
Status SetDivider(uint32_t divider)
Definition: clock_tree.h:382
void Release()
Release a reference to this clock tree element.
Definition: clock_tree.h:218
void Acquire()
Acquire a reference to this clock tree element.
Definition: clock_tree.h:215
Status Acquire()
Definition: clock_tree.h:502
Status DoAcquireLocked() final
Definition: clock_tree.h:243
std::enable_if_t< T::kMayFail, pw::Status > SetDivider(uint32_t divider)
Definition: clock_tree.h:429
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:178
virtual Status DoReleaseLocked()=0
Status Acquire()
Definition: clock_tree.h:68
Element & element() const
Return the element implementing this interface.
Definition: clock_tree.h:391
Status DoReleaseLocked() final
Definition: clock_tree.h:260
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:174
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:280
Status DoAcquire() final
Handle Acquire(), deferring locking the child class.
Definition: clock_tree.h:198
uint32_t divider() const
Get current divider value.
Definition: clock_tree.h:446
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:418
Status DoRelease() final
Handle Release(), deferring locking the child class.
Definition: clock_tree.h:202
constexpr DependentElement(ElementType &source)
Create a dependent clock tree element that depends on source.
Definition: clock_tree.h:302
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:282
Status Release()
Definition: clock_tree.h:513
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:310
Status AcquireWith(Element &element_with)
Definition: clock_tree.h:89
Status DoReleaseLocked() final
Definition: clock_tree.h:336
virtual Status DoDisable()
Definition: clock_tree.h:142
Clock tree management library.
Definition: clock_tree.h:30
constexpr Status OkStatus()
Definition: status.h:235