mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-10 12:53:42 +08:00
Move platform shutdown to destructor.
Change-Id: Ifeca1c5fe11d8e562b9f4641737b6bf1ac70aac6
This commit is contained in:

committed by
sys_ocldev

parent
b7545f1401
commit
b20bcb8b31
@ -62,8 +62,28 @@ Platform::Platform() {
|
||||
}
|
||||
|
||||
Platform::~Platform() {
|
||||
shutdown();
|
||||
asyncEventsHandler->closeThread();
|
||||
TakeOwnershipWrapper<Platform> platformOwnership(*this);
|
||||
executionEnvironment->decRefInternal();
|
||||
|
||||
if (state == StateNone) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto dev : this->devices) {
|
||||
if (dev) {
|
||||
dev->decRefInternal();
|
||||
}
|
||||
}
|
||||
devices.clear();
|
||||
state = StateNone;
|
||||
|
||||
delete platformInfo;
|
||||
platformInfo = nullptr;
|
||||
|
||||
std::string().swap(compilerExtensions);
|
||||
|
||||
gtpinNotifyPlatformShutdown();
|
||||
}
|
||||
|
||||
cl_int Platform::getInfo(cl_platform_info paramName,
|
||||
@ -183,30 +203,6 @@ bool Platform::isInitialized() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Platform::shutdown() {
|
||||
asyncEventsHandler->closeThread();
|
||||
TakeOwnershipWrapper<Platform> platformOwnership(*this);
|
||||
|
||||
if (state == StateNone) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto dev : this->devices) {
|
||||
if (dev) {
|
||||
dev->decRefInternal();
|
||||
}
|
||||
}
|
||||
devices.clear();
|
||||
state = StateNone;
|
||||
|
||||
delete platformInfo;
|
||||
platformInfo = nullptr;
|
||||
|
||||
std::string().swap(compilerExtensions);
|
||||
|
||||
gtpinNotifyPlatformShutdown();
|
||||
}
|
||||
|
||||
Device *Platform::getDevice(size_t deviceOrdinal) {
|
||||
TakeOwnershipWrapper<Platform> platformOwnership(*this);
|
||||
|
||||
|
@ -48,6 +48,9 @@ class Platform : public BaseObject<_cl_platform_id> {
|
||||
Platform();
|
||||
~Platform() override;
|
||||
|
||||
Platform(const Platform &) = delete;
|
||||
Platform &operator=(Platform const &) = delete;
|
||||
|
||||
cl_int getInfo(cl_platform_info paramName,
|
||||
size_t paramValueSize,
|
||||
void *paramValue,
|
||||
@ -57,7 +60,6 @@ class Platform : public BaseObject<_cl_platform_id> {
|
||||
|
||||
bool initialize();
|
||||
bool isInitialized();
|
||||
void shutdown();
|
||||
|
||||
size_t getNumDevices() const;
|
||||
Device **getDevices();
|
||||
|
@ -21,6 +21,7 @@
|
||||
set(IGDRCL_SRCS_tests_mocks
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_32bitAllocator.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_async_event_handler.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_async_event_handler.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_aub_subcapture_manager.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/mock_block_kernel_manager.h
|
||||
|
26
unit_tests/mocks/mock_async_event_handler.cpp
Normal file
26
unit_tests/mocks/mock_async_event_handler.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "unit_tests/mocks/mock_async_event_handler.h"
|
||||
namespace MockAsyncEventHandlerGlobals {
|
||||
bool destructorCalled = false;
|
||||
}
|
@ -30,6 +30,9 @@
|
||||
#include <iterator>
|
||||
|
||||
using namespace OCLRT;
|
||||
namespace MockAsyncEventHandlerGlobals {
|
||||
extern bool destructorCalled;
|
||||
}
|
||||
|
||||
class MockHandler : public AsyncEventsHandler {
|
||||
public:
|
||||
@ -43,11 +46,13 @@ class MockHandler : public AsyncEventsHandler {
|
||||
if (!allowThreadCreating) {
|
||||
asyncProcess(this); // process once for cleanup
|
||||
}
|
||||
MockAsyncEventHandlerGlobals::destructorCalled = true;
|
||||
}
|
||||
|
||||
MockHandler(bool allowAsync = false) : AsyncEventsHandler() {
|
||||
allowThreadCreating = allowAsync;
|
||||
transferCounter.store(0);
|
||||
MockAsyncEventHandlerGlobals::destructorCalled = false;
|
||||
}
|
||||
|
||||
Event *process() {
|
||||
@ -70,7 +75,6 @@ class MockHandler : public AsyncEventsHandler {
|
||||
|
||||
bool peekIsListEmpty() { return list.size() == 0; }
|
||||
bool peekIsRegisterListEmpty() { return registerList.size() == 0; }
|
||||
|
||||
std::atomic<int> transferCounter;
|
||||
bool openThreadCalled = false;
|
||||
bool allowThreadCreating = false;
|
||||
|
@ -62,13 +62,6 @@ TEST_F(PlatformTest, getDevices) {
|
||||
|
||||
auto allDevices = pPlatform->getDevices();
|
||||
EXPECT_NE(nullptr, allDevices);
|
||||
|
||||
pPlatform->shutdown();
|
||||
devNum = pPlatform->getNumDevices();
|
||||
EXPECT_EQ(0u, devNum);
|
||||
|
||||
allDevices = pPlatform->getDevices();
|
||||
EXPECT_EQ(nullptr, allDevices);
|
||||
}
|
||||
|
||||
TEST_F(PlatformTest, PlatformgetAsCompilerEnabledExtensionsString) {
|
||||
@ -82,16 +75,6 @@ TEST_F(PlatformTest, PlatformgetAsCompilerEnabledExtensionsString) {
|
||||
if (std::string(pPlatform->getDevice(0)->getDeviceInfo().clVersion).find("OpenCL 2.1") != std::string::npos) {
|
||||
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("cl_khr_subgroups")));
|
||||
}
|
||||
|
||||
pPlatform->shutdown();
|
||||
compilerExtensions.shrink_to_fit();
|
||||
}
|
||||
|
||||
TEST_F(PlatformTest, destructorCallsShutdownAndReleasesAllResources) {
|
||||
Platform *platform = new Platform;
|
||||
ASSERT_NE(nullptr, platform);
|
||||
platform->initialize();
|
||||
delete platform;
|
||||
}
|
||||
|
||||
TEST_F(PlatformTest, hasAsyncEventsHandler) {
|
||||
@ -107,10 +90,8 @@ TEST(PlatformTestSimple, shutdownClosesAsyncEventHandlerThread) {
|
||||
EXPECT_EQ(mockAsyncHandler, platform->getAsyncEventsHandler());
|
||||
|
||||
mockAsyncHandler->openThread();
|
||||
|
||||
platform->shutdown();
|
||||
EXPECT_EQ(nullptr, mockAsyncHandler->thread);
|
||||
delete platform;
|
||||
EXPECT_TRUE(MockAsyncEventHandlerGlobals::destructorCalled);
|
||||
}
|
||||
|
||||
namespace OCLRT {
|
||||
@ -220,3 +201,9 @@ TEST(PlatformConstructionTest, givenPlatformConstructorWhenItIsCalledAfterResetT
|
||||
EXPECT_NE(platform2, nullptr);
|
||||
platformImpl.reset(nullptr);
|
||||
}
|
||||
|
||||
TEST(PlatformConstructionTest, givenPlatformThatIsNotInitializedWhenGetDevicesIsCalledThenNullptrIsReturned) {
|
||||
Platform platform;
|
||||
auto devices = platform.getDevices();
|
||||
EXPECT_EQ(nullptr, devices);
|
||||
}
|
@ -33,10 +33,6 @@ struct PlatformTestMt : public ::testing::Test {
|
||||
pP->initialize();
|
||||
}
|
||||
|
||||
static void shutdownThreadFunc(Platform *pP) {
|
||||
pP->shutdown();
|
||||
}
|
||||
|
||||
cl_int retVal = CL_SUCCESS;
|
||||
std::unique_ptr<Platform> pPlatform;
|
||||
};
|
||||
@ -60,7 +56,7 @@ TEST_F(PlatformTestMt, initialize) {
|
||||
|
||||
EXPECT_TRUE(pPlatform->isInitialized());
|
||||
|
||||
pPlatform->shutdown();
|
||||
pPlatform.reset(new Platform());
|
||||
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
threads[i] = std::thread(callinitPlatform, pPlatform.get(), &ret[i]);
|
||||
@ -72,30 +68,18 @@ TEST_F(PlatformTestMt, initialize) {
|
||||
for (int i = 0; i < 10; ++i)
|
||||
EXPECT_TRUE(ret[i]);
|
||||
|
||||
pPlatform->shutdown();
|
||||
}
|
||||
|
||||
TEST_F(PlatformTestMt, mtSafeTest) {
|
||||
size_t devNum = pPlatform->getNumDevices();
|
||||
EXPECT_EQ(0u, devNum);
|
||||
|
||||
bool ret = pPlatform->initialize();
|
||||
std::thread t1(PlatformTestMt::initThreadFunc, pPlatform.get());
|
||||
std::thread t2(PlatformTestMt::shutdownThreadFunc, pPlatform.get());
|
||||
EXPECT_TRUE(ret);
|
||||
std::thread t2(PlatformTestMt::initThreadFunc, pPlatform.get());
|
||||
|
||||
t1.join();
|
||||
t2.join();
|
||||
|
||||
std::thread t3(PlatformTestMt::initThreadFunc, pPlatform.get());
|
||||
std::thread t4(PlatformTestMt::initThreadFunc, pPlatform.get());
|
||||
|
||||
t3.join();
|
||||
t4.join();
|
||||
|
||||
devNum = pPlatform->getNumDevices();
|
||||
EXPECT_EQ(numPlatformDevices, devNum);
|
||||
pPlatform->shutdown();
|
||||
devNum = pPlatform->getNumDevices();
|
||||
EXPECT_EQ(0u, devNum);
|
||||
}
|
||||
|
Reference in New Issue
Block a user