66//
77// ===----------------------------------------------------------------------===//
88
9+ #include < detail/config.hpp>
910#include < detail/handler_impl.hpp>
1011#include < detail/kernel_bundle_impl.hpp>
12+ #include < detail/program_manager/program_manager.hpp>
1113#include < detail/queue_impl.hpp>
1214#include < detail/scheduler/commands.hpp>
1315#include < sycl/sycl.hpp>
1416
1517#include < helpers/MockKernelInfo.hpp>
18+ #include < helpers/ScopedEnvVar.hpp>
1619#include < helpers/UrImage.hpp>
1720#include < helpers/UrMock.hpp>
1821
@@ -208,7 +211,6 @@ TEST(EliminatedArgMask, KernelBundleWith2Kernels) {
208211
209212std::vector<std::unique_ptr<mock::dummy_handle_t_>> UsedProgramHandles;
210213std::vector<std::unique_ptr<mock::dummy_handle_t_>> ProgramHandlesToReuse;
211-
212214inline ur_result_t setFixedProgramPtr (void *pParams) {
213215 auto params = *static_cast <ur_program_create_with_il_params_t *>(pParams);
214216 if (ProgramHandlesToReuse.size ())
@@ -218,18 +220,23 @@ inline ur_result_t setFixedProgramPtr(void *pParams) {
218220 ProgramHandlesToReuse.erase (ProgramHandlesToReuse.begin (), it);
219221 }
220222 else
221- UsedProgramHandles.push_back (std::make_unique<mock::dummy_handle_t_>(mock::createDummyHandle<ur_program_handle_t >(sizeof (unsigned ))));
222- **params.pphProgram = *reinterpret_cast <ur_program_handle_t *>(UsedProgramHandles.back ().get ());
223- std::cout << " **params.pphProgram = " << **params.pphProgram << std::endl;
223+ UsedProgramHandles.push_back (
224+ std::make_unique<mock::dummy_handle_t_>(sizeof (unsigned )));
225+ **params.pphProgram =
226+ reinterpret_cast <ur_program_handle_t >(UsedProgramHandles.back ().get ());
224227 return UR_RESULT_SUCCESS;
225228}
226229inline ur_result_t releaseFixedProgramPtr (void *pParams) {
227- ur_program_handle_t & params = *static_cast <ur_program_handle_t *>(pParams);
230+ auto params = *static_cast <ur_program_release_params_t *>(pParams);
228231 {
229- auto it = std::find_if (UsedProgramHandles.begin (), UsedProgramHandles.end (), [¶ms](const std::unique_ptr<mock::dummy_handle_t_>& item){ return *reinterpret_cast <ur_program_handle_t *>(item.get ()) == params; });
232+ auto it = std::find_if (
233+ UsedProgramHandles.begin (), UsedProgramHandles.end (),
234+ [¶ms](const std::unique_ptr<mock::dummy_handle_t_> &item) {
235+ return reinterpret_cast <ur_program_handle_t >(item.get ()) ==
236+ *params.phProgram ;
237+ });
230238 if (it == UsedProgramHandles.end ())
231239 return UR_RESULT_SUCCESS;
232- std::cout << " releaseFixedProgramPtr = " << params << std::endl;
233240 std::move (it, it + 1 , std::back_inserter (ProgramHandlesToReuse));
234241 UsedProgramHandles.erase (it, it +1 );
235242 }
@@ -241,6 +248,15 @@ inline ur_result_t customProgramRetain(void *pParams) {
241248 return UR_RESULT_SUCCESS;
242249}
243250
251+ class ProgramManagerTest {
252+ public:
253+ static std::unordered_multimap<ur_program_handle_t ,
254+ const sycl::detail::RTDeviceBinaryImage *> &
255+ getNativePrograms () {
256+ return sycl::detail::ProgramManager::getInstance ().NativePrograms ;
257+ }
258+ };
259+
244260// It's possible for the same handle to be reused for multiple distinct programs
245261// This can happen if a program is released (freeing underlying memory) and then
246262// a new program happens to get given that same memory for its handle.
@@ -250,6 +266,7 @@ inline ur_result_t customProgramRetain(void *pParams) {
250266TEST (EliminatedArgMask, ReuseOfHandleValues) {
251267 sycl::detail::ProgramManager &PM =
252268 sycl::detail::ProgramManager::getInstance ();
269+ auto &NativePrograms = ProgramManagerTest::getNativePrograms ();
253270
254271 ur_program_handle_t ProgBefore = nullptr ;
255272 ur_program_handle_t ProgAfter = nullptr ;
@@ -273,8 +290,11 @@ TEST(EliminatedArgMask, ReuseOfHandleValues) {
273290 EXPECT_NE (Mask, nullptr );
274291 EXPECT_EQ (Mask->at (0 ), 1 );
275292 EXPECT_EQ (UsedProgramHandles.size (), 1u );
293+ EXPECT_EQ (NativePrograms.count (ProgBefore), 1u );
276294 }
277295
296+ EXPECT_EQ (UsedProgramHandles.size (), 0u );
297+
278298 {
279299 auto Name = sycl::detail::KernelInfo<EAMTestKernel3>::getName ();
280300 sycl::unittest::UrMock<> Mock;
@@ -294,6 +314,8 @@ TEST(EliminatedArgMask, ReuseOfHandleValues) {
294314 auto Mask = PM.getEliminatedKernelArgMask (ProgAfter, Name);
295315 EXPECT_NE (Mask, nullptr );
296316 EXPECT_EQ (Mask->at (0 ), 0 );
317+ EXPECT_EQ (UsedProgramHandles.size (), 1u );
318+ EXPECT_EQ (NativePrograms.count (ProgBefore), 1u );
297319 }
298320
299321 // Verify that the test is behaving correctly and that the pointer is being
0 commit comments