Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/onetbb/test/common/state_trackable.h
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

180 lines
6.4 KiB
C++

/*
Copyright (c) 2005-2021 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef __TBB_test_common_state_trackable_H
#define __TBB_test_common_state_trackable_H
#include "common/test.h"
#include <map>
#include <atomic>
// Declarations for a class that can track operations applied to its objects.
struct StateTrackableBase {
enum StateValue {
ZeroInitialized = 0,
DefaultInitialized = 0xDEFAUL,
DirectInitialized = 0xD1111,
CopyInitialized = 0xC0314,
MoveInitialized = 0xAAAAA,
CopyAssigned = 0x11AED,
MoveAssigned = 0x22AED,
MovedFrom = 0xFFFFF,
Destroyed = 0xDEADF00,
Unspecified = 0xEEEEE
};
class State {
public:
State() noexcept : state(Unspecified) {}
State( const State& s ) : state(Unspecified) {
assign_new_state(s.state);
}
State( StateValue s ) noexcept : state(Unspecified) {
assign_new_state(s);
}
State& operator=( const State& st ) noexcept {
assign_new_state(st.state);
return *this;
}
State& operator=( StateValue s ) noexcept {
assign_new_state(s);
return *this;
}
operator StateValue() const noexcept { return state; }
private:
void assign_new_state( StateValue s ) noexcept;
StateValue state;
}; // class State
}; // struct StateTrackableBase
struct StateTrackableCounters {
static void reset() {
counters[StateTrackableBase::ZeroInitialized] = counters[StateTrackableBase::DefaultInitialized] =
counters[StateTrackableBase::DirectInitialized] = counters[StateTrackableBase::CopyInitialized] =
counters[StateTrackableBase::MoveInitialized] = counters[StateTrackableBase::CopyAssigned] =
counters[StateTrackableBase::MoveAssigned] = counters[StateTrackableBase::MovedFrom] =
counters[StateTrackableBase::Destroyed] = counters[StateTrackableBase::Unspecified] = 0;
}
static bool initialize() {
reset();
return true;
}
using counters_type = std::map<StateTrackableBase::StateValue, std::atomic<std::size_t>>;
static counters_type counters;
}; // struct StateTrackableCounters
StateTrackableCounters::counters_type StateTrackableCounters::counters;
static const bool state_initialized = StateTrackableCounters::initialize();
void StateTrackableBase::State::assign_new_state( StateValue s ) noexcept {
CHECK_FAST_MESSAGE(state_initialized, "State trackable counters are not initialized");
CHECK_FAST_MESSAGE((s == StateTrackableBase::Unspecified ||
StateTrackableCounters::counters.find(s) != StateTrackableCounters::counters.end()),
"Current state value is unknown");
CHECK_FAST_MESSAGE((state == StateTrackableBase::Unspecified ||
StateTrackableCounters::counters.find(state) != StateTrackableCounters::counters.end()),
"New state value is unknown");
state = s;
++StateTrackableCounters::counters[state];
}
template <bool AllowZeroInitialized = false>
struct StateTrackable : StateTrackableBase {
static constexpr bool allow_zero_initialized = AllowZeroInitialized;
bool is_valid() const {
return state == DefaultInitialized || state == DirectInitialized || state == CopyInitialized ||
state == MoveInitialized || state == CopyAssigned || state == MoveAssigned || state == MovedFrom ||
(allow_zero_initialized && state == ZeroInitialized);
}
StateTrackable( intptr_t ) noexcept : state(DirectInitialized) {}
StateTrackable() noexcept : state(DefaultInitialized) {}
StateTrackable( const StateTrackable& src ) noexcept : state(CopyInitialized) {
CHECK_FAST_MESSAGE(src.is_valid(), "Bad source for copy ctor");
}
StateTrackable( StateTrackable&& src ) noexcept : state(MoveInitialized) {
CHECK_FAST_MESSAGE(src.is_valid(), "Bad source for move ctor");
src.state = MovedFrom;
}
StateTrackable& operator=( const StateTrackable& src ) noexcept {
CHECK_FAST_MESSAGE(is_valid(), "Copy assignment to invalid instance");
CHECK_FAST_MESSAGE(src.is_valid(), "Bad source for copy assignment");
state = CopyAssigned;
return *this;
}
StateTrackable& operator=( StateTrackable&& src ) noexcept {
CHECK_FAST_MESSAGE(is_valid(), "Move assignment to invalid instance");
CHECK_FAST_MESSAGE(src.is_valid(), "Bad source for move assignment");
state = MoveAssigned;
src.state = MovedFrom;
return *this;
}
~StateTrackable() noexcept {
CHECK_FAST_MESSAGE(is_valid(), "Calling destructor on invalid instance. (May be twice)");
state = Destroyed;
}
State state;
}; // struct StateTrackable
template <StateTrackableBase::StateValue desired_state, bool allow_zero_initialized>
bool is_state( const StateTrackable<allow_zero_initialized>& f ) {
return f.state == desired_state;
}
template <StateTrackableBase::StateValue desired_state>
struct is_not_state_predicate {
template <bool allow_zero_initialized>
bool operator()( const StateTrackable<allow_zero_initialized>& f ) {
return !is_state<desired_state>(f);
}
// To operate with the associative containers
template <typename T, typename U>
bool operator()( const std::pair<T, U>& p ) {
return !is_state<desired_state>(p.second);
}
};
template <StateTrackableBase::StateValue desired_state>
struct is_state_predicate {
template <bool allow_zero_initialized>
bool operator()( const StateTrackable<allow_zero_initialized>& f ) {
return is_state<desired_state>(f);
}
template <typename T, typename U>
bool operator()( const std::pair<T, U>& p ) {
return is_state<desired_state>(p.second);
}
};
#endif // __TBB_test_common_state_trackable_H