파일
rocm-systems/rocclr/runtime/platform/object.cpp
T

89 라인
1.5 KiB
C++
Raw 일반 보기 히스토리

2014-07-04 16:17:05 -04:00
//
// 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