compute-runtime/unit_tests/helpers/base_object_tests_mt.cpp

53 lines
1.3 KiB
C++

/*
* Copyright (C) 2017-2019 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "runtime/accelerators/intel_accelerator.h"
#include "runtime/command_queue/command_queue.h"
#include "runtime/platform/platform.h"
#include "gtest/gtest.h"
namespace NEO {
TEST(BaseObjectTestsMt, givenObjectOwnershipForEachThreadWhenIncrementingNonAtomicValueThenNoDataRacesAreExpected) {
CommandQueue *object = new CommandQueue;
object->takeOwnership();
uint32_t counter = 0;
const uint32_t loopCount = 50;
const uint32_t numThreads = 3;
auto incrementNonAtomicValue = [&](CommandQueue *obj) {
for (uint32_t i = 0; i < loopCount; i++) {
obj->takeOwnership();
counter++;
obj->releaseOwnership();
}
};
EXPECT_EQ(0U, object->getCond().peekNumWaiters());
std::thread t1(incrementNonAtomicValue, object);
std::thread t2(incrementNonAtomicValue, object);
std::thread t3(incrementNonAtomicValue, object);
while (object->getCond().peekNumWaiters() != numThreads) {
std::this_thread::yield();
}
EXPECT_EQ(0u, counter);
object->releaseOwnership();
t1.join();
t2.join();
t3.join();
EXPECT_EQ(loopCount * numThreads, counter);
object->release();
}
} // namespace NEO