Files
rocm-systems/rocclr/platform/object.cpp
T
Laurent Morichetti 20c7173849 Merge branch 'origin/pghafari/vdi-prototype' into lmoriche/amd-master
Change-Id: Id3b833d405596735becb3346f3b08c6da57033fe
2020-01-30 20:12:13 -08:00

76 baris
1.4 KiB
C++

//
// Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
//
#include "platform/object.hpp"
#include <cstring>
namespace amd {
Atomic<ObjectMetadata::Key> ObjectMetadata::nextKey_ = 1;
ObjectMetadata::Destructor ObjectMetadata::destructors_[OCL_MAX_KEYS] = {NULL};
bool ObjectMetadata::check(Key key) { return key > 0 && key <= OCL_MAX_KEYS; }
ObjectMetadata::Key ObjectMetadata::createKey(Destructor destructor) {
Key key = nextKey_++;
if (!check(key)) {
return 0;
}
destructors_[key - 1] = destructor;
return key;
}
ObjectMetadata::~ObjectMetadata() {
if (!values_) {
return;
}
for (size_t i = 0; i < OCL_MAX_KEYS; ++i) {
if (values_[i] && destructors_[i]) {
destructors_[i](values_[i]);
}
}
delete[] values_;
}
void* ObjectMetadata::getValueForKey(Key key) const {
if (!values_ || !check(key)) {
return NULL;
}
return values_[key - 1];
}
bool ObjectMetadata::setValueForKey(Key key, Value value) {
if (!check(key)) {
return false;
}
while (!values_) {
Value* values = new Value[OCL_MAX_KEYS];
memset(values, '\0', sizeof(Value) * OCL_MAX_KEYS);
if (!values_.compareAndSet(NULL, values)) {
delete[] values;
}
}
size_t index = key - 1;
Value prev = AtomicOperation::swap(value, &values_[index]);
if (prev && destructors_[index] != NULL) {
destructors_[index](prev);
}
return true;
}
} // namespace amd