diff --git a/runtime/memory_manager/memory_manager.cpp b/runtime/memory_manager/memory_manager.cpp index 393aad4570..8511b24afb 100644 --- a/runtime/memory_manager/memory_manager.cpp +++ b/runtime/memory_manager/memory_manager.cpp @@ -385,6 +385,7 @@ RequirementsStatus MemoryManager::checkAllocationsForOverlapping(AllocationRequi void MemoryManager::registerOsContext(OsContext *contextToRegister) { contextToRegister->incRefInternal(); + contextToRegister->setContextId(static_cast(registeredOsContexts.size())); registeredOsContexts.push_back(contextToRegister); } diff --git a/runtime/os_interface/os_context.h b/runtime/os_interface/os_context.h index 0e817e711d..e4f9ca8c17 100644 --- a/runtime/os_interface/os_context.h +++ b/runtime/os_interface/os_context.h @@ -35,7 +35,11 @@ class OsContext : public ReferenceTrackedObject { return osContextImpl.get(); }; + void setContextId(uint32_t inputContextId) { contextId = inputContextId; } + uint32_t getContextId() { return contextId; } + protected: std::unique_ptr osContextImpl; + uint32_t contextId = 0; }; } // namespace OCLRT diff --git a/unit_tests/device/device_tests.cpp b/unit_tests/device/device_tests.cpp index 07c56209bf..6779f3f71d 100644 --- a/unit_tests/device/device_tests.cpp +++ b/unit_tests/device/device_tests.cpp @@ -23,6 +23,7 @@ #include "runtime/device/device.h" #include "runtime/helpers/options.h" #include "runtime/indirect_heap/indirect_heap.h" +#include "runtime/os_interface/os_context.h" #include "test.h" #include "unit_tests/fixtures/device_fixture.h" #include "unit_tests/helpers/debug_manager_state_restore.h" @@ -181,6 +182,17 @@ TEST(DeviceCreation, givenDeviceWhenItIsCreatedThenOsContextIsRegistredInMemoryM EXPECT_EQ(1u, memoryManager->getOsContextCount()); } +TEST(DeviceCreation, givenMultiDeviceWhenTheyAreCreatedThenEachOsContextHasUniqueId) { + ExecutionEnvironment executionEnvironment; + executionEnvironment.incRefInternal(); + auto device = std::unique_ptr(Device::create(nullptr, &executionEnvironment)); + auto device2 = std::unique_ptr(Device::create(nullptr, &executionEnvironment)); + + EXPECT_EQ(0u, device->getOsContext()->getContextId()); + EXPECT_EQ(1u, device2->getOsContext()->getContextId()); + EXPECT_EQ(2u, device->getMemoryManager()->getOsContextCount()); +} + TEST(DeviceCreation, givenFtrSimulationModeFlagTrueWhenNoOtherSimulationFlagsArePresentThenIsSimulationReturnsTrue) { FeatureTable skuTable = *platformDevices[0]->pSkuTable; skuTable.ftrSimulationMode = true;