diff --git a/runtime/kernel/kernel.cpp b/runtime/kernel/kernel.cpp index 9ac9154410..c3692fbb65 100644 --- a/runtime/kernel/kernel.cpp +++ b/runtime/kernel/kernel.cpp @@ -100,12 +100,12 @@ Kernel::~Kernel() { crossThreadDataSize = 0; if (privateSurface) { - device.getMemoryManager()->checkGpuUsageAndDestroyGraphicsAllocations(privateSurface); + program->peekExecutionEnvironment().memoryManager->checkGpuUsageAndDestroyGraphicsAllocations(privateSurface); privateSurface = nullptr; } if (kernelReflectionSurface) { - device.getMemoryManager()->freeGraphicsMemory(kernelReflectionSurface); + program->peekExecutionEnvironment().memoryManager->freeGraphicsMemory(kernelReflectionSurface); kernelReflectionSurface = nullptr; } diff --git a/unit_tests/kernel/kernel_tests.cpp b/unit_tests/kernel/kernel_tests.cpp index ab11b6c018..65e2c8487a 100644 --- a/unit_tests/kernel/kernel_tests.cpp +++ b/unit_tests/kernel/kernel_tests.cpp @@ -2411,3 +2411,16 @@ TEST(KernelTest, whenAllocationReadOnlyNonFlushRequiredThenAssignNullPointerToCa EXPECT_EQ(nullptr, kernel.mockKernel->kernelArgRequiresCacheFlush[0]); } +TEST(KernelTest, givenKernelUsesPrivateMemoryWhenDeviceReleasedBeforeKernelThenKernelUsesMemoryManagerFromEnvironment) { + auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(platformDevices[0])); + auto executionEnvironment = device->getExecutionEnvironment(); + + auto mockKernel = std::make_unique(*device); + GraphicsAllocation *privateSurface = device->getExecutionEnvironment()->memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}); + mockKernel->mockKernel->setPrivateSurface(privateSurface, 10); + + executionEnvironment->incRefInternal(); + device.reset(nullptr); + mockKernel.reset(nullptr); + executionEnvironment->decRefInternal(); +}