From 53d99ead24b490194161aaefdf273a686adfcc3f Mon Sep 17 00:00:00 2001 From: "Woloszyn, Wojciech" Date: Fri, 10 Aug 2018 04:42:52 -0700 Subject: [PATCH] Fix sampler lifecycle - Add refcount to sampler to avoid use after free Change-Id: I0f03d8ed29b5b9dc5bee355ed266ac7437e92509 --- runtime/kernel/kernel.cpp | 21 ++- runtime/kernel/kernel.h | 4 +- runtime/sampler/sampler.h | 6 + .../accelerators/media_image_arg_tests.cpp | 2 +- .../cl_set_kernel_arg_svm_pointer_tests.inl | 2 +- .../api/cl_set_kernel_exec_info_tests.inl | 2 +- unit_tests/kernel/clone_kernel_tests.cpp | 2 +- .../kernel/kernel_accelerator_arg_tests.cpp | 2 +- .../kernel/kernel_arg_buffer_fixture.cpp | 2 +- .../kernel/kernel_arg_dev_queue_tests.cpp | 2 +- unit_tests/kernel/kernel_arg_pipe_tests.cpp | 2 +- unit_tests/kernel/kernel_arg_svm_tests.cpp | 2 +- .../kernel/kernel_immediate_arg_tests.cpp | 2 +- unit_tests/kernel/kernel_slm_arg_tests.cpp | 2 +- unit_tests/kernel/kernel_tests.cpp | 2 +- .../kernel/kernel_transformable_tests.cpp | 5 +- unit_tests/mem_obj/buffer_set_arg_tests.cpp | 2 +- unit_tests/mem_obj/image_set_arg_tests.cpp | 2 +- unit_tests/program/printf_handler_tests.cpp | 4 +- unit_tests/sampler/sampler_set_arg_tests.cpp | 121 +++++++++++++++++- unit_tests/sampler/sampler_tests.cpp | 27 ++++ .../scheduler/scheduler_kernel_tests.cpp | 38 +++--- 22 files changed, 216 insertions(+), 38 deletions(-) diff --git a/runtime/kernel/kernel.cpp b/runtime/kernel/kernel.cpp index 1f799271af..097ea73c77 100644 --- a/runtime/kernel/kernel.cpp +++ b/runtime/kernel/kernel.cpp @@ -124,6 +124,15 @@ Kernel::~Kernel() { kernelReflectionSurface = nullptr; } + for (uint32_t i = 0; i < patchedArgumentsNum; i++) { + if (kernelInfo.kernelArgInfo.at(i).isSampler) { + auto sampler = castToObject(kernelArguments.at(i).object); + if (sampler) { + sampler->decRefInternal(); + } + } + } + kernelArgHandlers.clear(); program->release(); } @@ -889,7 +898,7 @@ cl_int Kernel::setArgSvmAlloc(uint32_t argIndex, void *svmPtr, GraphicsAllocatio return CL_SUCCESS; } -void Kernel::storeKernelArg(uint32_t argIndex, kernelArgType argType, const void *argObject, +void Kernel::storeKernelArg(uint32_t argIndex, kernelArgType argType, void *argObject, const void *argValue, size_t argSize, GraphicsAllocation *argSvmAlloc, cl_mem_flags argSvmFlags) { kernelArguments[argIndex].type = argType; @@ -1302,6 +1311,16 @@ cl_int Kernel::setArgSampler(uint32_t argIndex, auto clSamplerObj = *(static_cast(argVal)); auto pSampler = castToObject(clSamplerObj); + if (pSampler) { + pSampler->incRefInternal(); + } + + if (kernelArguments.at(argIndex).object) { + auto oldSampler = castToObject(kernelArguments.at(argIndex).object); + UNRECOVERABLE_IF(!oldSampler); + oldSampler->decRefInternal(); + } + if (pSampler && argSize == sizeof(cl_sampler *)) { const auto &kernelArgInfo = kernelInfo.kernelArgInfo[argIndex]; diff --git a/runtime/kernel/kernel.h b/runtime/kernel/kernel.h index b775276cf2..f21806b3e4 100644 --- a/runtime/kernel/kernel.h +++ b/runtime/kernel/kernel.h @@ -66,7 +66,7 @@ class Kernel : public BaseObject<_cl_kernel> { struct SimpleKernelArgInfo { kernelArgType type; - const void *object; + void *object; const void *value; size_t size; GraphicsAllocation *pSvmAlloc; @@ -283,7 +283,7 @@ class Kernel : public BaseObject<_cl_kernel> { void storeKernelArg(uint32_t argIndex, kernelArgType argType, - const void *argObject, + void *argObject, const void *argValue, size_t argSize, GraphicsAllocation *argSvmAlloc = nullptr, diff --git a/runtime/sampler/sampler.h b/runtime/sampler/sampler.h index 16a6759614..359d620158 100644 --- a/runtime/sampler/sampler.h +++ b/runtime/sampler/sampler.h @@ -146,4 +146,10 @@ typedef Sampler *(*SamplerCreateFunc)(Context *context, float lodMax); typedef size_t (*getSamplerStateSizeHwFunc)(); + +template <> +inline Sampler *castToObject(const void *object) { + auto clSamplerObj = reinterpret_cast(object); + return castToObject(const_cast(clSamplerObj)); +} } // namespace OCLRT diff --git a/unit_tests/accelerators/media_image_arg_tests.cpp b/unit_tests/accelerators/media_image_arg_tests.cpp index 084ecf977d..69469f9a43 100644 --- a/unit_tests/accelerators/media_image_arg_tests.cpp +++ b/unit_tests/accelerators/media_image_arg_tests.cpp @@ -80,9 +80,9 @@ class MediaImageSetArgTest : public DeviceFixture, } void TearDown() override { - delete pKernelInfo; delete srcImage; delete pKernel; + delete pKernelInfo; delete context; DeviceFixture::TearDown(); } diff --git a/unit_tests/api/cl_set_kernel_arg_svm_pointer_tests.inl b/unit_tests/api/cl_set_kernel_arg_svm_pointer_tests.inl index 0b1f6f78aa..cc89df3438 100644 --- a/unit_tests/api/cl_set_kernel_arg_svm_pointer_tests.inl +++ b/unit_tests/api/cl_set_kernel_arg_svm_pointer_tests.inl @@ -65,8 +65,8 @@ class KernelArgSvmFixture : public api_fixture, public DeviceFixture { } void TearDown() override { - delete pKernelInfo; delete pMockKernel; + delete pKernelInfo; DeviceFixture::TearDown(); api_fixture::TearDown(); diff --git a/unit_tests/api/cl_set_kernel_exec_info_tests.inl b/unit_tests/api/cl_set_kernel_exec_info_tests.inl index e5bfa00e61..0ec8ad19ac 100644 --- a/unit_tests/api/cl_set_kernel_exec_info_tests.inl +++ b/unit_tests/api/cl_set_kernel_exec_info_tests.inl @@ -47,8 +47,8 @@ class KernelExecInfoFixture : public api_fixture { clSVMFree(pContext, ptrSvm); } - delete pKernelInfo; delete pMockKernel; + delete pKernelInfo; api_fixture::TearDown(); } diff --git a/unit_tests/kernel/clone_kernel_tests.cpp b/unit_tests/kernel/clone_kernel_tests.cpp index 838c556dbe..67904299ce 100644 --- a/unit_tests/kernel/clone_kernel_tests.cpp +++ b/unit_tests/kernel/clone_kernel_tests.cpp @@ -108,9 +108,9 @@ class CloneKernelFixture : public ContextFixture, public DeviceFixture { } void TearDown() override { - delete pKernelInfo; delete pSourceKernel; delete pClonedKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_accelerator_arg_tests.cpp b/unit_tests/kernel/kernel_accelerator_arg_tests.cpp index 7d790e2677..d298e83b6c 100644 --- a/unit_tests/kernel/kernel_accelerator_arg_tests.cpp +++ b/unit_tests/kernel/kernel_accelerator_arg_tests.cpp @@ -90,8 +90,8 @@ class KernelArgAcceleratorFixture : public ContextFixture, public DeviceFixture } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_arg_buffer_fixture.cpp b/unit_tests/kernel/kernel_arg_buffer_fixture.cpp index 5e8e28dd7f..3eb505f677 100644 --- a/unit_tests/kernel/kernel_arg_buffer_fixture.cpp +++ b/unit_tests/kernel/kernel_arg_buffer_fixture.cpp @@ -70,8 +70,8 @@ void KernelArgBufferFixture::SetUp() { } void KernelArgBufferFixture::TearDown() { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_arg_dev_queue_tests.cpp b/unit_tests/kernel/kernel_arg_dev_queue_tests.cpp index 5ab5dab84b..2a588e7356 100644 --- a/unit_tests/kernel/kernel_arg_dev_queue_tests.cpp +++ b/unit_tests/kernel/kernel_arg_dev_queue_tests.cpp @@ -60,8 +60,8 @@ struct KernelArgDevQueueTest : public DeviceFixture, } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pDeviceQueue; DeviceHostQueueFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_arg_pipe_tests.cpp b/unit_tests/kernel/kernel_arg_pipe_tests.cpp index 0f912bb4fc..356529eac1 100644 --- a/unit_tests/kernel/kernel_arg_pipe_tests.cpp +++ b/unit_tests/kernel/kernel_arg_pipe_tests.cpp @@ -79,8 +79,8 @@ class KernelArgPipeFixture : public ContextFixture, public DeviceFixture { } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_arg_svm_tests.cpp b/unit_tests/kernel/kernel_arg_svm_tests.cpp index 84c2ac69ea..ade9d1533c 100644 --- a/unit_tests/kernel/kernel_arg_svm_tests.cpp +++ b/unit_tests/kernel/kernel_arg_svm_tests.cpp @@ -76,8 +76,8 @@ class KernelArgSvmFixture_ : public ContextFixture, public DeviceFixture { } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/kernel/kernel_immediate_arg_tests.cpp b/unit_tests/kernel/kernel_immediate_arg_tests.cpp index d87f92a0fa..50cc5746d9 100644 --- a/unit_tests/kernel/kernel_immediate_arg_tests.cpp +++ b/unit_tests/kernel/kernel_immediate_arg_tests.cpp @@ -81,8 +81,8 @@ class KernelArgImmediateTest : public Test { } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; DeviceFixture::TearDown(); } diff --git a/unit_tests/kernel/kernel_slm_arg_tests.cpp b/unit_tests/kernel/kernel_slm_arg_tests.cpp index 53b63f5461..35f42a44c5 100644 --- a/unit_tests/kernel/kernel_slm_arg_tests.cpp +++ b/unit_tests/kernel/kernel_slm_arg_tests.cpp @@ -70,8 +70,8 @@ class KernelSlmArgTest : public Test { } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; DeviceFixture::TearDown(); } diff --git a/unit_tests/kernel/kernel_tests.cpp b/unit_tests/kernel/kernel_tests.cpp index 320cb12a9b..edddd59b7f 100644 --- a/unit_tests/kernel/kernel_tests.cpp +++ b/unit_tests/kernel/kernel_tests.cpp @@ -1740,8 +1740,8 @@ struct KernelExecutionEnvironmentTest : public Test { } void TearDown() override { - delete pKernelInfo; delete pKernel; + delete pKernelInfo; DeviceFixture::TearDown(); } diff --git a/unit_tests/kernel/kernel_transformable_tests.cpp b/unit_tests/kernel/kernel_transformable_tests.cpp index b1c823a57a..d0150f4d55 100644 --- a/unit_tests/kernel/kernel_transformable_tests.cpp +++ b/unit_tests/kernel/kernel_transformable_tests.cpp @@ -83,11 +83,11 @@ class KernelTransformableTest : public ::testing::Test { cl_int retVal = CL_SUCCESS; MockContext context; std::unique_ptr program; - std::unique_ptr pKernel; + std::unique_ptr sampler; std::unique_ptr pKernelInfo; + std::unique_ptr pKernel; std::unique_ptr image; - std::unique_ptr sampler; SKernelBinaryHeaderCommon kernelHeader; char surfaceStateHeap[0x80]; }; @@ -262,6 +262,7 @@ HWTEST_F(KernelTransformableTest, givenKernelWithTwoTransformableImagesAndTwoTra EXPECT_FALSE(firstSurfaceState->getSurfaceArray()); EXPECT_EQ(SURFACE_TYPE::SURFACE_TYPE_SURFTYPE_3D, secondSurfaceState->getSurfaceType()); EXPECT_FALSE(secondSurfaceState->getSurfaceArray()); + pKernel.reset(); } HWTEST_F(KernelTransformableTest, givenKernelWithNonTransformableSamplersWhenResetSamplerWithNontransformableThenImagesNotChangedAgain) { diff --git a/unit_tests/mem_obj/buffer_set_arg_tests.cpp b/unit_tests/mem_obj/buffer_set_arg_tests.cpp index aa21cea747..fc3e927c1d 100644 --- a/unit_tests/mem_obj/buffer_set_arg_tests.cpp +++ b/unit_tests/mem_obj/buffer_set_arg_tests.cpp @@ -98,8 +98,8 @@ class BufferSetArgTest : public ContextFixture, void TearDown() override { delete buffer; delete BufferDefaults::context; - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; ContextFixture::TearDown(); DeviceFixture::TearDown(); diff --git a/unit_tests/mem_obj/image_set_arg_tests.cpp b/unit_tests/mem_obj/image_set_arg_tests.cpp index b452d01563..d3719470f7 100644 --- a/unit_tests/mem_obj/image_set_arg_tests.cpp +++ b/unit_tests/mem_obj/image_set_arg_tests.cpp @@ -112,9 +112,9 @@ class ImageSetArgTest : public DeviceFixture, } void TearDown() override { - delete pKernelInfo; delete srcImage; delete pKernel; + delete pKernelInfo; delete context; DeviceFixture::TearDown(); } diff --git a/unit_tests/program/printf_handler_tests.cpp b/unit_tests/program/printf_handler_tests.cpp index 796e0b8ac1..0ee37e4908 100644 --- a/unit_tests/program/printf_handler_tests.cpp +++ b/unit_tests/program/printf_handler_tests.cpp @@ -52,8 +52,8 @@ TEST(PrintfHandlerTest, givenNotPreparedPrintfHandlerWhenGetSurfaceIsCalledThenR delete printfHandler; delete pPrintfSurface; - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; delete device; } @@ -81,8 +81,8 @@ TEST(PrintfHandlerTest, givenPreparedPrintfHandlerWhenGetSurfaceIsCalledThenResu delete printfHandler; delete pPrintfSurface; - delete pKernelInfo; delete pKernel; + delete pKernelInfo; delete pProgram; delete device; } diff --git a/unit_tests/sampler/sampler_set_arg_tests.cpp b/unit_tests/sampler/sampler_set_arg_tests.cpp index 3e1d216237..2d7f2822de 100644 --- a/unit_tests/sampler/sampler_set_arg_tests.cpp +++ b/unit_tests/sampler/sampler_set_arg_tests.cpp @@ -27,6 +27,7 @@ #include "runtime/helpers/sampler_helpers.h" #include "runtime/utilities/numeric.h" #include "unit_tests/fixtures/device_fixture.h" +#include "unit_tests/fixtures/image_fixture.h" #include "test.h" #include "unit_tests/mocks/mock_context.h" #include "unit_tests/mocks/mock_kernel.h" @@ -84,9 +85,9 @@ class SamplerSetArgFixture : public DeviceFixture { } void TearDown() { + delete pKernel; delete pKernelInfo; delete sampler; - delete pKernel; delete context; DeviceFixture::TearDown(); } @@ -165,6 +166,124 @@ HWTEST_F(SamplerSetArgTest, getKernelArgShouldReturnSampler) { EXPECT_EQ(samplerObj, pKernel->getKernelArg(0)); } +HWTEST_F(SamplerSetArgTest, GivenSamplerObjectWhenSetKernelArgIsCalledThenIncreaseSamplerRefcount) { + cl_sampler samplerObj = Sampler::create( + context, + CL_TRUE, + CL_ADDRESS_MIRRORED_REPEAT, + CL_FILTER_NEAREST, + retVal); + + auto pSampler = castToObject(samplerObj); + auto refCountBefore = pSampler->getRefInternalCount(); + + retVal = pKernel->setArg( + 0, + sizeof(samplerObj), + &samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); + auto refCountAfter = pSampler->getRefInternalCount(); + + EXPECT_EQ(refCountBefore + 1, refCountAfter); + + retVal = clReleaseSampler(samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); +} + +HWTEST_F(SamplerSetArgTest, GivenSamplerObjectWhenSetKernelArgIsCalledAndKernelIsDeletedThenRefCountIsUnchanged) { + auto myKernel = std::make_unique(program.get(), *pKernelInfo, *pDevice); + ASSERT_NE(nullptr, myKernel.get()); + ASSERT_EQ(CL_SUCCESS, myKernel->initialize()); + + myKernel->setKernelArgHandler(0, &Kernel::setArgSampler); + myKernel->setKernelArgHandler(1, &Kernel::setArgSampler); + + uint32_t crossThreadData[crossThreadDataSize] = {}; + myKernel->setCrossThreadData(crossThreadData, sizeof(crossThreadData)); + cl_sampler samplerObj = Sampler::create( + context, + CL_TRUE, + CL_ADDRESS_MIRRORED_REPEAT, + CL_FILTER_NEAREST, + retVal); + + auto pSampler = castToObject(samplerObj); + auto refCountBefore = pSampler->getRefInternalCount(); + + retVal = myKernel->setArg( + 0, + sizeof(samplerObj), + &samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); + + myKernel.reset(); + + auto refCountAfter = pSampler->getRefInternalCount(); + + EXPECT_EQ(refCountBefore, refCountAfter); + + retVal = clReleaseSampler(samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); +} + +HWTEST_F(SamplerSetArgTest, GivenNewSamplerObjectWhensSetKernelArgIsCalledThenDecreaseOldSamplerRefcount) { + cl_sampler samplerObj = Sampler::create( + context, + CL_TRUE, + CL_ADDRESS_MIRRORED_REPEAT, + CL_FILTER_NEAREST, + retVal); + + auto clSamplerObj = *(static_cast(&samplerObj)); + cl_sampler s = clSamplerObj; + auto pSampler = castToObjectOrAbort(s); + + retVal = pKernel->setArg( + 0, + sizeof(samplerObj), + &samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); + + auto refCountBefore = pSampler->getRefInternalCount(); + + cl_sampler samplerObj2 = Sampler::create( + context, + CL_TRUE, + CL_ADDRESS_MIRRORED_REPEAT, + CL_FILTER_NEAREST, + retVal); + + retVal = pKernel->setArg( + 0, + sizeof(samplerObj2), + &samplerObj2); + ASSERT_EQ(CL_SUCCESS, retVal); + + auto refCountAfter = pSampler->getRefInternalCount(); + + EXPECT_EQ(refCountBefore - 1, refCountAfter); + + retVal = clReleaseSampler(samplerObj); + ASSERT_EQ(CL_SUCCESS, retVal); + retVal = clReleaseSampler(samplerObj2); + ASSERT_EQ(CL_SUCCESS, retVal); +} + +HWTEST_F(SamplerSetArgTest, GivenIncorrentSamplerObjectWhenSetKernelArgSamplerIsCalledThenLeaveRefcountAsIs) { + auto notSamplerObj = std::unique_ptr(ImageHelper::create(context)); + + auto pNotSampler = castToObject(notSamplerObj.get()); + auto refCountBefore = pNotSampler->getRefInternalCount(); + + retVal = pKernel->setArgSampler( + 0, + sizeof(notSamplerObj.get()), + notSamplerObj.get()); + auto refCountAfter = pNotSampler->getRefInternalCount(); + + EXPECT_EQ(refCountBefore, refCountAfter); +} + HWTEST_F(SamplerSetArgTest, WithFilteringNearestAndAddressingClClampSetAsKernelArgumentSetsConstantBuffer) { sampler = Sampler::create( diff --git a/unit_tests/sampler/sampler_tests.cpp b/unit_tests/sampler/sampler_tests.cpp index 21d475d160..4a4b47275e 100644 --- a/unit_tests/sampler/sampler_tests.cpp +++ b/unit_tests/sampler/sampler_tests.cpp @@ -21,6 +21,7 @@ */ #include "runtime/sampler/sampler.h" +#include "unit_tests/fixtures/image_fixture.h" #include "unit_tests/mocks/mock_context.h" #include "unit_tests/mocks/mock_sampler.h" #include "gtest/gtest.h" @@ -130,3 +131,29 @@ INSTANTIATE_TEST_CASE_P(Sampler, ::testing::ValuesIn(normalizedCoordModes), ::testing::ValuesIn(addressingModes), ::testing::ValuesIn(filterModes))); + +TEST(castToSamplerTest, GivenGenericPointerWhichHoldsSamplerObjectWhenCastToSamplerIsCalledThenCastWithSuccess) { + cl_int retVal; + auto context = std::make_unique(); + cl_sampler clSampler = Sampler::create( + context.get(), + CL_TRUE, + CL_ADDRESS_MIRRORED_REPEAT, + CL_FILTER_NEAREST, + retVal); + ASSERT_EQ(CL_SUCCESS, retVal); + auto ptr = reinterpret_cast(clSampler); + auto sampler = castToObject(ptr); + + EXPECT_NE(nullptr, sampler); + clReleaseSampler(clSampler); +} + +TEST(castToSamplerTest, GivenGenericPointerWhichDoestNotHoldSamplerObjectWhenCastToSamplerIsCalledThenCastWithAFailure) { + auto context = std::make_unique(); + auto notSamplerObj = std::unique_ptr(ImageHelper::create(context.get())); + auto ptr = reinterpret_cast(notSamplerObj.get()); + auto notSampler = castToObject(ptr); + + EXPECT_EQ(nullptr, notSampler); +} diff --git a/unit_tests/scheduler/scheduler_kernel_tests.cpp b/unit_tests/scheduler/scheduler_kernel_tests.cpp index a13d794b4d..c2ab8e2bac 100644 --- a/unit_tests/scheduler/scheduler_kernel_tests.cpp +++ b/unit_tests/scheduler/scheduler_kernel_tests.cpp @@ -41,13 +41,8 @@ class MockSchedulerKernel : public SchedulerKernel { MockSchedulerKernel(Program *program, const KernelInfo &info, const Device &device) : SchedulerKernel(program, info, device) { } - ~MockSchedulerKernel() override { - if (kernelInfoOwner) - delete &kernelInfo; - } - - static MockSchedulerKernel *create(Program &program, Device &device) { - KernelInfo *info = new KernelInfo; + static MockSchedulerKernel *create(Program &program, Device &device, KernelInfo *&info) { + info = new KernelInfo; SPatchDataParameterStream dataParametrStream; dataParametrStream.DataParameterStreamSize = 8; dataParametrStream.Size = 8; @@ -70,11 +65,8 @@ class MockSchedulerKernel : public SchedulerKernel { } MockSchedulerKernel *mock = Kernel::create(&program, *info, nullptr); - mock->kernelInfoOwner = true; return mock; } - - bool kernelInfoOwner = false; }; TEST(SchedulerKernelTest, getLws) { @@ -142,8 +134,10 @@ TEST(SchedulerKernelTest, setArgsForSchedulerKernel) { auto device = unique_ptr(MockDevice::createWithNewExecutionEnvironment(nullptr)); MockProgram program; program.setDevice(device.get()); - - unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get())); + unique_ptr info(nullptr); + KernelInfo *infoPtr = nullptr; + unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get(), infoPtr)); + info.reset(infoPtr); unique_ptr allocs[9]; for (uint32_t i = 0; i < 9; i++) { @@ -170,7 +164,10 @@ TEST(SchedulerKernelTest, setArgsForSchedulerKernelWithNullDebugQueue) { MockProgram program; program.setDevice(device.get()); - unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get())); + unique_ptr info(nullptr); + KernelInfo *infoPtr = nullptr; + unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get(), infoPtr)); + info.reset(infoPtr); unique_ptr allocs[9]; for (uint32_t i = 0; i < 9; i++) { @@ -200,7 +197,10 @@ TEST(SchedulerKernelTest, createKernelReflectionForForcedSchedulerDispatch) { MockProgram program; program.setDevice(device.get()); - unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get())); + unique_ptr info(nullptr); + KernelInfo *infoPtr = nullptr; + unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get(), infoPtr)); + info.reset(infoPtr); scheduler->createReflectionSurface(); @@ -215,7 +215,10 @@ TEST(SchedulerKernelTest, createKernelReflectionSecondTimeForForcedSchedulerDisp MockProgram program; program.setDevice(device.get()); - unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get())); + unique_ptr info(nullptr); + KernelInfo *infoPtr = nullptr; + unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get(), infoPtr)); + info.reset(infoPtr); scheduler->createReflectionSurface(); @@ -234,7 +237,10 @@ TEST(SchedulerKernelTest, createKernelReflectionForSchedulerDoesNothing) { MockProgram program; program.setDevice(device.get()); - unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get())); + unique_ptr info(nullptr); + KernelInfo *infoPtr = nullptr; + unique_ptr scheduler = unique_ptr(MockSchedulerKernel::create(program, *device.get(), infoPtr)); + info.reset(infoPtr); scheduler->createReflectionSurface();