49 void record(CpuTimeMode mode, Time::Timestamp now,
size_t processor = 0) {
50 Entry* state = entry(mode);
51 if (installProcessorBaseline(state, processor, now)) {
55 Time::Timestamp* baseline = &state->timestamp;
56 Time::Timestamp previous = __atomic_load_n(baseline, __ATOMIC_ACQUIRE);
57 if (now <= previous) {
63 __atomic_compare_exchange_n(baseline, &previous, now,
false, __ATOMIC_ACQ_REL,
73 size_t processor = 0) {
74 Entry* state = entry(mode);
75 if (state->processor != processor || now > state->timestamp) {
76 state->timestamp = now;
77 state->processor = processor;
81 Time::Timestamp elapsed(CpuTimeMode mode, Time::Timestamp now,
size_t processor = 0) {
82 Entry* state = entry(mode);
83 if (installProcessorBaseline(state, processor, now)) {
87 Time::Timestamp* baseline = &state->timestamp;
88 Time::Timestamp previous = __atomic_load_n(baseline, __ATOMIC_ACQUIRE);
96 const Time::Timestamp elapsed = now - previous;
97 return __atomic_compare_exchange_n(baseline, &previous, now,
false, __ATOMIC_ACQ_REL,
105 size_t processor = 0) {
106 Entry* state = entry(mode);
107 if (state->processor != processor) {
108 state->timestamp = now;
109 state->processor = processor;
112 if (now < state->timestamp) {
115 const Time::Timestamp elapsed = now - state->timestamp;
116 state->timestamp = now;
122 Entry() : timestamp(0), processor(~
static_cast<size_t>(0)) {}
124 Time::Timestamp timestamp;
128 static bool installProcessorBaseline(
Entry* state,
size_t processor, Time::Timestamp now) {
129 if (__atomic_load_n(&state->processor, __ATOMIC_ACQUIRE) == processor) {
136 __atomic_store_n(&state->timestamp, now, __ATOMIC_RELEASE);
137 __atomic_store_n(&state->processor, processor, __ATOMIC_RELEASE);
142 return mode == CpuTimeMode::User ? &m_User : &m_Kernel;
189 __atomic_add_fetch(&m_Published,
static_cast<size_t>(1), __ATOMIC_RELEASE);
194 __atomic_store_n(&m_Active,
static_cast<size_t>(1), __ATOMIC_RELEASE);
195 return __atomic_load_n(&m_Published, __ATOMIC_ACQUIRE);
200 __atomic_store_n(&m_Completed, generation, __ATOMIC_RELEASE);
201 __atomic_store_n(&m_Active,
static_cast<size_t>(0), __ATOMIC_RELEASE);
204 bool ready(
bool stopping =
false)
const {
205 return stopping || __atomic_load_n(&m_Active, __ATOMIC_ACQUIRE) || !caughtUp();
208 bool caughtUp()
const {
209 return __atomic_load_n(&m_Published, __ATOMIC_ACQUIRE) ==
210 __atomic_load_n(&m_Completed, __ATOMIC_ACQUIRE);