Fix Multiadapter ULT issue reproducibilty

diff --git a/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp b/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp
index 39d2b4c..aa6ac6c 100644
--- a/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp
+++ b/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp
@@ -25,71 +25,51 @@
 #endif
 #include <stdlib.h>
 
-ADAPTER_INFO *      MACommonULT::pGfxAdapterInfo[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-PLATFORM            MACommonULT::GfxPlatform[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-GMM_LIB_CONTEXT *   MACommonULT::pLibContext[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-GMM_CLIENT_CONTEXT *MACommonULT::pGmmULTClientContext[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-PFNGMMINIT          MACommonULT::pfnGmmInit[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-PFNGMMDESTROY       MACommonULT::pfnGmmDestroy[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-GMM_INIT_IN_ARGS    MACommonULT::InArgs[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-GMM_INIT_OUT_ARGS   MACommonULT::OutArgs[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-GMM_DLL_HANDLE      MACommonULT::hGmmLib[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-
-// Comman array for all thread related ULTs to supply Adapter-Client Context input.
-ThreadInParams MACommonULT::InParams[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER];
-
-// Array to store the adapter BDFs from simulated UMD, Save the adapter bdf in an array.
-ADAPTER_BDF MACommonULT::AdpaterSaved[MAX_NUM_ADAPTERS];
-
 MACommonULT::MACommonULT()
 {
-}
+    // Ideally this should be in the SetUp function for each test case, but since there are
+    // wrapper classes around this for the test suites and SetUp does not get called on this
+    // class, it needs to go in the constructor which gets created for each test case.
 
-MACommonULT::~MACommonULT()
-{
-}
+    //reset all test info
+    memset(GmmTestInfo, 0, sizeof(GmmTestInfo));
+    memset(AdapterSaved, 0, sizeof(AdapterSaved));
 
-void MACommonULT::SetUpTestCase()
-{
-}
+    hGmmLib       = NULL;
+    pfnGmmDestroy = NULL;
+    pfnGmmInit    = NULL;
 
-void MACommonULT::TearDownTestCase()
-{
-}
+    //set a seed value so the test is always reproducible
+    srand(0);
 
-CTestMA::CTestMA()
-{
-    uint32_t i = 0;
-
-    memset(AdpaterSaved, 0, sizeof(AdpaterSaved));
     // Save the random Generated bdf value in an array during intantiation itself
     // These value remain live for each of the ULT lifetime.
-    for(i = 0; i < MAX_NUM_ADAPTERS; i++)
+    for (int i = 0; i < MAX_NUM_ADAPTERS; i++)
     {
-        AdpaterSaved[i].Bus      = rand() / 100;
-        AdpaterSaved[i].Device   = rand() / 100;
-        AdpaterSaved[i].Function = rand() / 100;
-        AdpaterSaved[i].Reserved = 0;
+        AdapterSaved[i].Bus      = rand() / 100;
+        AdapterSaved[i].Device   = rand() / 100;
+        AdapterSaved[i].Function = rand() / 100;
+        AdapterSaved[i].Reserved = 0;
     }
 
     // Validate the generated BDfs are unique
     // No two Adapter's BDF should be equal on a PCI bus.
-    for(i = 0; i < MAX_NUM_ADAPTERS; i++)
+    for (int i = 0; i < MAX_NUM_ADAPTERS; i++)
     {
-        for(uint32_t j = 0; j < MAX_NUM_ADAPTERS; j++)
+        for (int j = 0; j < MAX_NUM_ADAPTERS; j++)
         {
-            if(i != j)
+            if (i != j)
             {
-                if(AdpaterSaved[i].Bus == AdpaterSaved[j].Bus)
+                if (AdapterSaved[i].Bus == AdapterSaved[j].Bus)
                 {
-                    if(AdpaterSaved[i].Device == AdpaterSaved[j].Device)
+                    if (AdapterSaved[i].Device == AdapterSaved[j].Device)
                     {
-                        if(AdpaterSaved[i].Function == AdpaterSaved[j].Function)
+                        if (AdapterSaved[i].Function == AdapterSaved[j].Function)
                         {
                             // OOps! Generated BDFs are equal.
                             // Lets change any one field to make it unique
                             // Lets increment Bus.
-                            AdpaterSaved[j].Bus++;
+                            AdapterSaved[j].Bus++;
                         }
                     }
                 }
@@ -98,6 +78,14 @@
     }
 }
 
+MACommonULT::~MACommonULT()
+{
+}
+
+CTestMA::CTestMA()
+{
+}
+
 CTestMA::~CTestMA()
 {
 }
@@ -110,101 +98,251 @@
 {
 }
 
-void MACommonULT::LoadGmmDll(uint32_t AdapterIdx, uint32_t CountIdx)
+void CTestMA::SetUp()
 {
-    hGmmLib[AdapterIdx][CountIdx] = dlopen(GMM_UMD_DLL, RTLD_LAZY);
-    ASSERT_TRUE(hGmmLib[AdapterIdx][CountIdx]);
-
-    *(void **)(&pfnGmmInit[AdapterIdx][CountIdx])    = dlsym(hGmmLib[AdapterIdx][CountIdx], "InitializeGmm");
-    *(void **)(&pfnGmmDestroy[AdapterIdx][CountIdx]) = dlsym(hGmmLib[AdapterIdx][CountIdx], "GmmAdapterDestroy");
-
-    ASSERT_TRUE(pfnGmmInit[AdapterIdx][CountIdx]);
-    ASSERT_TRUE(pfnGmmDestroy[AdapterIdx][CountIdx]);
+    LoadGmmDll();
 }
 
-void MACommonULT::UnLoadGmmDll(uint32_t AdapterIdx, uint32_t CountIdx)
+void CTestMA::TearDown()
 {
-    if(hGmmLib[AdapterIdx][CountIdx])
-    {
-        dlclose(hGmmLib[AdapterIdx][CountIdx]);
-        hGmmLib[AdapterIdx][CountIdx] = NULL;
+    UnLoadGmmDll();
+}
+
+void MACommonULT::LoadGmmDll()
+{
+    hGmmLib = dlopen(GMM_UMD_DLL, RTLD_LAZY);
+    ASSERT_TRUE(hGmmLib);
+
+    *(void **)(&pfnGmmInit)    = dlsym(hGmmLib, "InitializeGmm");
+    *(void **)(&pfnGmmDestroy) = dlsym(hGmmLib, "GmmAdapterDestroy");
+
+    ASSERT_TRUE(pfnGmmInit);
+    ASSERT_TRUE(pfnGmmDestroy);
+}
+
+void MACommonULT::UnLoadGmmDll()
+{
+    if (hGmmLib)
+    {	    
+        dlclose(hGmmLib);
+
+        hGmmLib       = NULL;
+        pfnGmmInit    = NULL;
+        pfnGmmDestroy = NULL;
     }
 }
 
+// Lets test with the recent GPUs till 32nd adapters and take IGFX_COFFEELAKE for 32+ adapters
+// Only for our ULT to supply dummy ProductFamily
+PRODUCT_FAMILY MACommonULT::GetProductFamily(uint32_t AdapterIdx)
+{
+    switch (AdapterIdx)
+    {
+    case 0:
+        return IGFX_DG1;
+    case 1:
+        return IGFX_ICELAKE;
+    case 2:
+        return IGFX_TIGERLAKE_LP;
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+        return IGFX_DG2;
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 15:
+    case 16:
+        return IGFX_XE_HP_SDV;
+    case 17:
+    case 18:
+    case 19:
+    case 20:
+    case 21:
+    case 22:
+    case 23:
+    case 24:
+    case 25:
+    case 26:
+    case 27:
+    case 28:
+    case 29:
+        return IGFX_PVC;
+    case 30:
+    case 31:
+    default:
+        break;
+    }
+    return IGFX_COFFEELAKE;
+}
+
+// Lets test with the recent GPUs till 32nd adpater and take IGFX_GEN9_CORE for 32+ adapters
+// Only for our ULT to supply dummy GFXCORE_FAMILY
+GFXCORE_FAMILY MACommonULT::GetRenderCoreFamily(uint32_t AdapterIdx)
+{
+    switch (AdapterIdx)
+    {
+    case 0:
+        return IGFX_XE_HP_CORE;
+    case 1:
+        return IGFX_GEN11LP_CORE;
+    case 2:
+        return IGFX_GEN12LP_CORE;
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+        return IGFX_XE_HPG_CORE;
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 15:
+    case 16:
+        return IGFX_XE_HP_CORE;
+    case 17:
+    case 18:
+    case 19:
+    case 20:
+    case 21:
+    case 22:
+    case 23:
+    case 24:
+    case 25:
+    case 26:
+    case 27:
+    case 28:
+    case 29:
+        return IGFX_XE_HPC_CORE;
+    case 30:
+    case 31:
+    default:
+        break;
+    }
+    return IGFX_GEN9_CORE;
+}
+
+// To simulate the UMDs/ClinentContexts per adapter i.e MAX_COUNT_PER_ADAPTER
+// Increase MAX_COUNT_PER_ADAPTER value if there are more UMDs involved
+GMM_CLIENT MACommonULT::GetClientType(uint32_t CountIdx)
+{
+    switch (CountIdx)
+    {
+    case 0:
+        return GMM_D3D9_VISTA;
+    case 1:
+        return GMM_D3D10_VISTA;
+    case 2:
+        return GMM_D3D12_VISTA;
+    case 3:
+        return GMM_EXCITE_VISTA;
+    case 4:
+        return GMM_OCL_VISTA;
+    default:
+        break;
+    }
+    return GMM_D3D9_VISTA;
+}
+
+// Returns the AdapterSaved array value, Adapter BDFs based on input AdapterIdx
+ADAPTER_BDF MACommonULT::GetAdapterBDF(uint32_t AdapterIdx)
+{
+    ADAPTER_BDF AdapterBDF = {0, 2, 0, 0};
+
+    if (AdapterIdx < MAX_NUM_ADAPTERS)
+    {
+        AdapterBDF.Bus      = AdapterSaved[AdapterIdx].Bus;
+        AdapterBDF.Device   = AdapterSaved[AdapterIdx].Device;
+        AdapterBDF.Function = AdapterSaved[AdapterIdx].Function;
+    }
+    return AdapterBDF;
+}
+
 void MACommonULT::GmmInitModule(uint32_t AdapterIdx, uint32_t CountIdx)
 {
     ASSERT_TRUE(AdapterIdx < MAX_NUM_ADAPTERS);
-    GMM_STATUS  Status                                  = GMM_SUCCESS;
-    ADAPTER_BDF AdapterBDF                              = GetAdapterBDF(AdapterIdx);
-    GfxPlatform[AdapterIdx][CountIdx].eProductFamily    = GetProductFamily(AdapterIdx);
-    GfxPlatform[AdapterIdx][CountIdx].eRenderCoreFamily = GetRenderCoreFamily(AdapterIdx);
+    GMM_STATUS  Status                                              = GMM_SUCCESS;
+    ADAPTER_BDF AdapterBDF                                          = GetAdapterBDF(AdapterIdx);
+    GmmTestInfo[AdapterIdx][CountIdx].GfxPlatform.eProductFamily    = GetProductFamily(AdapterIdx);
+    GmmTestInfo[AdapterIdx][CountIdx].GfxPlatform.eRenderCoreFamily = GetRenderCoreFamily(AdapterIdx);
 
-    if(!pGfxAdapterInfo[AdapterIdx][CountIdx])
+    if (!GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo)
     {
-        pGfxAdapterInfo[AdapterIdx][CountIdx] = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
-        if(!pGfxAdapterInfo[AdapterIdx][CountIdx])
+        GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo = (ADAPTER_INFO *)malloc(sizeof(ADAPTER_INFO));
+        if (!GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo)
         {
             ASSERT_TRUE(false);
             return;
         }
-        memset(pGfxAdapterInfo[AdapterIdx][CountIdx], 0, sizeof(ADAPTER_INFO));
-        pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrTileY = 1; // Legacy TileY
-	
-	if(GfxPlatform[AdapterIdx][CountIdx].eRenderCoreFamily >= IGFX_GEN12_CORE)
+        memset(GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo, 0, sizeof(ADAPTER_INFO));
+
+        GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrTileY = 1; // Legacy TileY
+
+        if (GmmTestInfo[AdapterIdx][CountIdx].GfxPlatform.eRenderCoreFamily >= IGFX_GEN12_CORE)
         {
 
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrWddm2GpuMmu              = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrUserModeTranslationTable = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrE2ECompression           = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrLinearCCS                = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrTileY                    = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrLLCBypass                = 0;
-	    pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrWddm2Svm                 = 0;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrWddm2GpuMmu              = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrUserModeTranslationTable = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrE2ECompression           = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrLinearCCS                = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrTileY                    = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrLLCBypass                = 0;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrWddm2Svm                 = 0; // keep this disabled for pagetablemgr testing
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrSVM                      = 1; // keep this enabled for pagetablemgr testing
+            //GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.WaUntypedBufferCompression   = 1;
         }
 
-        if(IGFX_DG1 == GfxPlatform[AdapterIdx][CountIdx].eProductFamily)
+        if (IGFX_DG1 == GmmTestInfo[AdapterIdx][CountIdx].GfxPlatform.eProductFamily)
         {
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrLinearCCS             = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrStandardMipTailFormat = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrTileY                 = 0;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrLocalMemory           = 1;
-            pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable.FtrWddm2_1_64kbPages     = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrLinearCCS             = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrStandardMipTailFormat = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrTileY                 = 0;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrLocalMemory           = 1;
+            GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable.FtrWddm2_1_64kbPages     = 1;
         }
-
     }
 
-    InArgs[AdapterIdx][CountIdx].ClientType = GetClientType(CountIdx);
-    InArgs[AdapterIdx][CountIdx].pGtSysInfo = &pGfxAdapterInfo[AdapterIdx][CountIdx]->SystemInfo;
-    InArgs[AdapterIdx][CountIdx].pSkuTable  = &pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable;
-    InArgs[AdapterIdx][CountIdx].pWaTable   = &pGfxAdapterInfo[AdapterIdx][CountIdx]->WaTable;
-    InArgs[AdapterIdx][CountIdx].Platform   = GfxPlatform[AdapterIdx][CountIdx];
+
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.ClientType = GetClientType(CountIdx);
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.pGtSysInfo = &GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SystemInfo;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.pSkuTable  = &GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->SkuTable;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.pWaTable   = &GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo->WaTable;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.Platform   = GmmTestInfo[AdapterIdx][CountIdx].GfxPlatform;
 #if LHDM
-    InArgs[AdapterIdx][CountIdx].stAdapterBDF       = AdapterBDF;
-    InArgs[AdapterIdx][CountIdx].DeviceRegistryPath = NULL;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.stAdapterBDF       = AdapterBDF;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.DeviceRegistryPath = NULL;
 #else
-    InArgs[AdapterIdx][CountIdx].FileDescriptor = AdapterBDF.Data;
+    GmmTestInfo[AdapterIdx][CountIdx].InArgs.FileDescriptor = AdapterBDF.Data;
 #endif
 
-    Status = pfnGmmInit[AdapterIdx][CountIdx](&InArgs[AdapterIdx][CountIdx], &OutArgs[AdapterIdx][CountIdx]);
+    Status = pfnGmmInit(&GmmTestInfo[AdapterIdx][CountIdx].InArgs, &GmmTestInfo[AdapterIdx][CountIdx].OutArgs);
     EXPECT_EQ(Status, GMM_SUCCESS);
 
-    pGmmULTClientContext[AdapterIdx][CountIdx] = OutArgs[AdapterIdx][CountIdx].pGmmClientContext;
-    ASSERT_TRUE(pGmmULTClientContext[AdapterIdx][CountIdx]);
+    GmmTestInfo[AdapterIdx][CountIdx].pGmmULTClientContext = GmmTestInfo[AdapterIdx][CountIdx].OutArgs.pGmmClientContext;
+    ASSERT_TRUE(GmmTestInfo[AdapterIdx][CountIdx].pGmmULTClientContext);
 
-    pLibContext[AdapterIdx][CountIdx] = pGmmULTClientContext[AdapterIdx][CountIdx]->GetLibContext();
-    ASSERT_TRUE(pLibContext[AdapterIdx][CountIdx]);
+    GmmTestInfo[AdapterIdx][CountIdx].pLibContext = GmmTestInfo[AdapterIdx][CountIdx].pGmmULTClientContext->GetLibContext();
+    ASSERT_TRUE(GmmTestInfo[AdapterIdx][CountIdx].pLibContext);
 }
 
 void MACommonULT::GmmDestroyModule(uint32_t AdapterIdx, uint32_t CountIdx)
 {
-    OutArgs[AdapterIdx][CountIdx].pGmmClientContext = pGmmULTClientContext[AdapterIdx][CountIdx];
-    pfnGmmDestroy[AdapterIdx][CountIdx](&OutArgs[AdapterIdx][CountIdx]);
-    pGmmULTClientContext[AdapterIdx][CountIdx] = NULL;
-    pLibContext[AdapterIdx][CountIdx]          = NULL;
-    if(pGfxAdapterInfo[AdapterIdx][CountIdx])
+    GmmTestInfo[AdapterIdx][CountIdx].OutArgs.pGmmClientContext = GmmTestInfo[AdapterIdx][CountIdx].pGmmULTClientContext;
+    pfnGmmDestroy(&GmmTestInfo[AdapterIdx][CountIdx].OutArgs);
+    GmmTestInfo[AdapterIdx][CountIdx].pGmmULTClientContext = NULL;
+    GmmTestInfo[AdapterIdx][CountIdx].pLibContext          = NULL;
+    if (GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo)
     {
-        free(pGfxAdapterInfo[AdapterIdx][CountIdx]);
-        pGfxAdapterInfo[AdapterIdx][CountIdx] = NULL;
+        free(GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo);
+        GmmTestInfo[AdapterIdx][CountIdx].pGfxAdapterInfo = NULL;
     }
 }
 
@@ -213,7 +351,7 @@
 // MaxClientsThreads = MAX_NUM_ADAPTERS for ULT TestMTLoadMultipleAdapters
 // MaxClientsThreads = MAX_COUNT_PER_ADAPTER for ULT TestMTLoadAdaptersMultipleTimes
 // MaxClientsThreads = MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER, for ULT TestMTLoadMultipleAdaptersMultipleTimes
-void MACommonULT::CreateMAThread(uint32_t MaxClientThreads)
+static void CreateMAThread(uint32_t MaxClientThreads, ThreadInParams *InParams)
 {
     // Spawn all threads upto MaxClientThreads and wait for them all at once
     uint32_t  i = 0;
@@ -221,28 +359,26 @@
     pthread_t thread_id[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER]; /* thread's ID (just an integer)          */
 
     /* MaxClientsThreads to represent MAX_NUM_ADAPTERS *MAX_COUNT_PER_ADAPTER Clients */
-    for(i = 0; i < (MaxClientThreads); i++)
+    for (i = 0; i < (MaxClientThreads); i++)
     {
-        Status = pthread_create(&thread_id[i], NULL, Thread1, (void *)&InParams[i]);
+        Status = pthread_create(&thread_id[i], NULL, MAULTThreadEntryFunc, (void *)&InParams[i]);
         ASSERT_TRUE((!Status));
     }
 
     /* wait for threads to terminate */
-    for(i = 0; i < (MaxClientThreads); i++)
+    for (i = 0; i < (MaxClientThreads); i++)
     {
         Status = pthread_join(thread_id[i], NULL);
         ASSERT_TRUE((!Status));
     }
 }
 
-void *Thread1(void *lpParam)
+void *MAULTThreadEntryFunc(void *lpParam)
 {
     ThreadInParams *pInParams = (ThreadInParams *)(lpParam);
 
-    MACommonULT::LoadGmmDll(pInParams->AdapterIdx, pInParams->CountIdx);
-    MACommonULT::GmmInitModule(pInParams->AdapterIdx, pInParams->CountIdx);
-    MACommonULT::GmmDestroyModule(pInParams->AdapterIdx, pInParams->CountIdx);
-    MACommonULT::UnLoadGmmDll(pInParams->AdapterIdx, pInParams->CountIdx);
+    pInParams->MATestObj->GmmInitModule(pInParams->AdapterIdx, pInParams->CountIdx);
+    pInParams->MATestObj->GmmDestroyModule(pInParams->AdapterIdx, pInParams->CountIdx);
 
     pthread_exit(NULL);
 }
@@ -267,41 +403,29 @@
     uint32_t AdapterCount = 0;
     uint32_t i            = 0;
 
-    // Load the dll for all available adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        LoadGmmDll(AdapterCount, 0);
-    }
-
     // Initilize the dll for all available adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
         GmmInitModule(AdapterCount, 0);
     }
 
     // Check the Libcontext for each of the adapter is different or not
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
-        for(i = 0; i < MAX_NUM_ADAPTERS; i++)
+        for (i = 0; i < MAX_NUM_ADAPTERS; i++)
         {
-            if(AdapterCount != i)
+            if (AdapterCount != i)
             {
-                EXPECT_NE(pLibContext[AdapterCount][0], pLibContext[i][0]);
+                EXPECT_NE(GmmTestInfo[AdapterCount][0].pLibContext, GmmTestInfo[i][0].pLibContext);
             }
         }
     }
 
     // Un-Initilize the dll for all loaded adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
         GmmDestroyModule(AdapterCount, 0);
     }
-
-    // Unload the dll for all loaded adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        UnLoadGmmDll(AdapterCount, 0);
-    }
 }
 
 /// Load all adapters(MAX_NUM_ADAPTERS) multiple times up to MAX_COUNT_PER_ADAPTER in same process
@@ -309,51 +433,33 @@
 {
     uint32_t AdapterCount = 0, RefCount = 0;
 
-    // Load the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            LoadGmmDll(AdapterCount, RefCount);
-        }
-    }
-
     // Initilize the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
         {
             GmmInitModule(AdapterCount, RefCount);
         }
     }
     // For each adapter upto MAX_NUM_ADAPTERS Check the LibContext for all instances upto
     // MAX_COUNT_PER_ADAPTER to be equal
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER - 1; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER - 1; RefCount++)
         {
-            EXPECT_EQ(pLibContext[AdapterCount][RefCount], pLibContext[AdapterCount][RefCount + 1]);
+            EXPECT_EQ(GmmTestInfo[AdapterCount][RefCount].pLibContext, GmmTestInfo[AdapterCount][RefCount + 1].pLibContext);
         }
     }
 
     // Un-Initilize the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
     // The destroy/unload can be out of order
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
         {
             GmmDestroyModule(AdapterCount, RefCount);
         }
     }
-
-    // Unload the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            UnLoadGmmDll(AdapterCount, RefCount);
-        }
-    }
 }
 
 /// Test Init-Destroy multiple times Upto MAX_COUNT_PER_ADAPTER before Unloading DLL, on Same Adapter upto MAX_NUM_ADAPTERS
@@ -361,23 +467,14 @@
 {
     uint32_t AdapterCount = 0, RefCount = 0;
 
-    // Load the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            LoadGmmDll(AdapterCount, RefCount);
-        }
-    }
-
     // Initilize and destroy module upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
     // For each adapter(AdapterCount <  MAX_NUM_ADAPTERS) Check the LibContext for all instances to be equal
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
         // Initilize the dll upto MAX_COUNT_PER_ADAPTER times for each adapter
         // In reality the init and destroy can occurs any number of time on a particular adapter, so for simplcity treating that UMD
         // will load already loaded lib again for MAX_COUNT_PER_ADAPTER times.
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
         {
             GmmInitModule(AdapterCount, RefCount);
         }
@@ -388,26 +485,17 @@
         // Also our ULT is a Light-Weight process due to which the freed memory not assigned to other processes may get assigned again.
         // But mind that this is possible only when the previous libcontext intialized is compulsorily inactive and destroyed.
         // otherwise the same secnario as in TestLoadMultipleAdapters occurs .i.e different pointer value is returned on new adpater bdf.
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER - 1; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER - 1; RefCount++)
         {
-            EXPECT_EQ(pLibContext[AdapterCount][RefCount], pLibContext[AdapterCount][RefCount + 1]);
+            EXPECT_EQ(GmmTestInfo[AdapterCount][RefCount].pLibContext, GmmTestInfo[AdapterCount][RefCount + 1].pLibContext);
         }
 
         // Un-Initilize the dll upto MAX_COUNT_PER_ADAPTER times for each adapter
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+        for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
         {
             GmmDestroyModule(AdapterCount, RefCount);
         }
     }
-
-    // Unload the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            UnLoadGmmDll(AdapterCount, RefCount);
-        }
-    }
 }
 
 /// Test Init-Destroy multiple times before Unloading DLL, on Multiple Adapters
@@ -415,46 +503,28 @@
 {
     uint32_t AdapterCount = 0, RefCount = 0;
 
-    // Load the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            LoadGmmDll(AdapterCount, RefCount);
-        }
-    }
-
     // Initilize and destroy the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
     // For each adapter(AdapterCount <  MAX_NUM_ADAPTERS) Check the LibContext for all instances to is unique
     // This is similar to TestInitDestroyMultipleTimesOnSameAdapter ULT apart from the order of adapter initialization.
-    for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+    for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
     {
         // Initilize the dll upto MAX_COUNT_PER_ADAPTER times for each adapter
-        for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+        for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
         {
             GmmInitModule(AdapterCount, RefCount);
         }
         // Check the LibContext for each of the adpater(upto MAX_NUM_ADAPTERS) to be unique
         // whereas LibContext for all instances on a same adapter is to be equal
-        for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS - 1; AdapterCount++)
+        for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS - 1; AdapterCount++)
         {
-            EXPECT_NE(pLibContext[AdapterCount][RefCount], pLibContext[AdapterCount + 1][RefCount]);
+            EXPECT_NE(GmmTestInfo[AdapterCount][RefCount].pLibContext, GmmTestInfo[AdapterCount + 1][RefCount].pLibContext);
         }
 
-        for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+        for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
         {
             GmmDestroyModule(AdapterCount, RefCount);
         }
     }
-
-    // Unload the dll upto MAX_COUNT_PER_ADAPTER times for each of MAX_NUM_ADAPTERS adapters
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
-    {
-        for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
-        {
-            UnLoadGmmDll(AdapterCount, RefCount);
-        }
-    }
 }
 
 /*
@@ -466,56 +536,62 @@
 // Here the number of client per adapter is 1 .i.e 0th count Index
 TEST_F(CTestMA, TestMTLoadMultipleAdapters)
 {
-    uint32_t AdapterCount = 0;
+    uint32_t       AdapterCount = 0;
+    ThreadInParams InParams[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER];
 
     memset(InParams, 0, sizeof(InParams));
 
     //Populate the Inparams array with the MAX_NUM_ADAPTERS indices
-    for(AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
+    for (AdapterCount = 0; AdapterCount < MAX_NUM_ADAPTERS; AdapterCount++)
     {
         InParams[AdapterCount].AdapterIdx = AdapterCount;
         InParams[AdapterCount].CountIdx   = 0;
+        InParams[AdapterCount].MATestObj  = this;
     }
 
     // Create threads to load all Adapters upto MAX_NUM_ADAPTERS for a single client each
-    CreateMAThread(MAX_NUM_ADAPTERS);
+    CreateMAThread(MAX_NUM_ADAPTERS, InParams);
 }
 
 // Load a Single Adapter multiple times upto MAX_COUNT_PER_ADAPTER on multiple threads in same process
 TEST_F(CTestMA, TestMTLoadAdaptersMultipleTimes)
 {
-    uint32_t RefCount = 0;
+    uint32_t       RefCount = 0;
+    ThreadInParams InParams[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER];
 
     memset(InParams, 0, sizeof(InParams));
 
     //Populate the Inparams array with MAX_COUNT_PER_ADAPTER indices
-    for(RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
+    for (RefCount = 0; RefCount < MAX_COUNT_PER_ADAPTER; RefCount++)
     {
         InParams[RefCount].AdapterIdx = 0;
         InParams[RefCount].CountIdx   = RefCount;
+        InParams[RefCount].MATestObj  = this;
     }
     // Create threads to load all clients i.e MAX_COUNT_PER_ADAPTER on single adpater
-    CreateMAThread(MAX_COUNT_PER_ADAPTER);
+    CreateMAThread(MAX_COUNT_PER_ADAPTER, InParams);
 }
 
 // Load Multiple Adapters upto MAX_NUM_ADAPTERS, multiple times upto MAX_COUNT_PER_ADAPTER on multiple threads in same process
 TEST_F(CTestMA, TestMTLoadMultipleAdaptersMultipleTimes)
 {
-    uint32_t i = 0, j = 0, k = 0;
-    uint32_t AdapterCount = 0, RefCount = 0;
+    uint32_t       i = 0, j = 0, k = 0;
+    uint32_t       AdapterCount = 0, RefCount = 0;
+    ThreadInParams InParams[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER];
 
     memset(InParams, 0, sizeof(InParams));
 
     //Populate the Inparams array with the MAX_NUM_ADAPTERS*MAX_COUNT_PER_ADAPTER indices
     //Such that Each Adapter corresponds to its max mumber of clients in a sequential order
-    for(i = 0; i < (MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER); i++)
+    for (i = 0; i < (MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER); i++)
     {
-        for(j = 0; j < MAX_NUM_ADAPTERS; j++)
+        for (j = 0; j < MAX_NUM_ADAPTERS; j++)
         {
-            for(k = 0; k < MAX_COUNT_PER_ADAPTER; k++)
+            for (k = 0; k < MAX_COUNT_PER_ADAPTER; k++)
             {
                 InParams[i].AdapterIdx = AdapterCount;
                 InParams[i].CountIdx   = RefCount++;
+                InParams[i].MATestObj  = this;
                 i++;
             }
             RefCount = 0;
@@ -525,7 +601,7 @@
 
     // Create threads to load MAX_NUM_ADAPTERS, MAX_COUNT_PER_ADAPTER times
     // Thread Count = MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER
-    CreateMAThread(MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER);
+    CreateMAThread(MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER, InParams);
 }
 
 #endif // GMM_LIB_DLL_MA
diff --git a/Source/GmmLib/ULT/GmmMultiAdapterULT.h b/Source/GmmLib/ULT/GmmMultiAdapterULT.h
index c7f2ca8..6ec4292 100644
--- a/Source/GmmLib/ULT/GmmMultiAdapterULT.h
+++ b/Source/GmmLib/ULT/GmmMultiAdapterULT.h
@@ -24,8 +24,9 @@
 
 #include "stdafx.h"
 #include "GmmCommonULT.h"
+#include "../inc/External/Common/GmmClientContext.h"
 
-#define MAX_COUNT_PER_ADAPTER       3
+#define MAX_COUNT_PER_ADAPTER 5
 
 #ifdef _WIN32
 #define GMM_DLL_HANDLE      HINSTANCE
@@ -33,171 +34,68 @@
 #define GMM_DLL_HANDLE      void*
 #endif
 
-typedef struct ThreadInParams_Rec
+typedef struct GmmULTInfo_Rec
 {
-    uint32_t AdapterIdx;
-    uint32_t CountIdx;
-} ThreadInParams;
+    ADAPTER_INFO       *pGfxAdapterInfo;
+    PLATFORM            GfxPlatform;
+    GMM_LIB_CONTEXT    *pLibContext;
+    GMM_CLIENT_CONTEXT *pGmmULTClientContext;
+    GMM_INIT_IN_ARGS    InArgs;
+    GMM_INIT_OUT_ARGS   OutArgs;
+} GmmULTInfo;
 
 class MACommonULT : public testing::Test
 {
 public:
     MACommonULT();
     ~MACommonULT();
-    static void SetUpTestCase();
-    static void TearDownTestCase();
-    static void LoadGmmDll(uint32_t AdapterIdx, uint32_t CountIdx);
-    static void UnLoadGmmDll(uint32_t AdapterIdx, uint32_t CountIdx);
-    static void GmmInitModule(uint32_t AdapterIdx, uint32_t CountIdx);
-    static void GmmDestroyModule(uint32_t AdapterIdx, uint32_t CountIdx);
-    static void CreateMAThread(uint32_t MaxClientThreads);
 
-    static ADAPTER_INFO *           pGfxAdapterInfo[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static PLATFORM                 GfxPlatform[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static GMM_LIB_CONTEXT *        pLibContext[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static GMM_CLIENT_CONTEXT *     pGmmULTClientContext[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static PFNGMMINIT               pfnGmmInit[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static PFNGMMDESTROY            pfnGmmDestroy[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static GMM_INIT_IN_ARGS         InArgs[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static GMM_INIT_OUT_ARGS        OutArgs[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
-    static GMM_DLL_HANDLE           hGmmLib[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
+    void LoadGmmDll();
+    void UnLoadGmmDll();
+    void GmmInitModule(uint32_t AdapterIdx, uint32_t CountIdx);
+    void GmmDestroyModule(uint32_t AdapterIdx, uint32_t CountIdx);
 
-    // Comman Input paramter array for all thread related ULTs to supply Adapter-Client Context input.
+    PRODUCT_FAMILY GetProductFamily(uint32_t AdapterIdx);
+    GFXCORE_FAMILY GetRenderCoreFamily(uint32_t AdapterIdx);
+    GMM_CLIENT     GetClientType(uint32_t CountIdx);
+    ADAPTER_BDF    GetAdapterBDF(uint32_t AdapterIdx);
 
-    static ThreadInParams           InParams[MAX_NUM_ADAPTERS * MAX_COUNT_PER_ADAPTER];
+protected:
+    GmmULTInfo GmmTestInfo[MAX_NUM_ADAPTERS][MAX_COUNT_PER_ADAPTER];
+
+    GMM_DLL_HANDLE hGmmLib;
+    PFNGMMINIT     pfnGmmInit;
+    PFNGMMDESTROY  pfnGmmDestroy;
 
     // Array to store the adapter BDFs from simulated UMD, Save the adapter bdf in an array
-    static ADAPTER_BDF              AdpaterSaved[MAX_NUM_ADAPTERS];
-    
-    // Only for our ULT to supply dummy ProductFamily
-    static PRODUCT_FAMILY GetProductFamily(uint32_t AdapterIdx)
-    {
-        switch (AdapterIdx)
-        {
-        case 0:   return IGFX_DG1;
-        case 1:   return IGFX_ICELAKE;
-        case 2:   return IGFX_TIGERLAKE_LP;
-        case 3:
-        case 4:
-        case 5:
-        case 6:
-        case 7:
-        case 8:
-        case 9:   return IGFX_DG2;
-        case 11:
-        case 12:
-        case 13:
-        case 14:
-        case 15:
-        case 16:   return IGFX_XE_HP_SDV;
-        case 17:
-        case 18:
-        case 19:
-        case 20:
-        case 21:
-        case 22:
-        case 23:
-        case 24:
-        case 25:
-        case 26:
-        case 27:
-        case 28:
-        case 29:   return IGFX_PVC;
-	case 30:
-        case 31:
-	default: break;
-        }
-        return IGFX_COFFEELAKE;
-    }
-
-    // Only for our ULT to supply dummy GFXCORE_FAMILY
-    static GFXCORE_FAMILY GetRenderCoreFamily(uint32_t AdapterIdx)
-    {
-        switch (AdapterIdx)
-        {
-        case 0:   return IGFX_XE_HP_CORE;
-        case 1:   return IGFX_GEN11LP_CORE;
-        case 2:   return IGFX_GEN12LP_CORE;
-        case 3:
-        case 4:
-        case 5:
-        case 6:
-        case 7:
-        case 8:
-        case 9:   return IGFX_XE_HPG_CORE;
-        case 11:
-        case 12:
-        case 13:
-        case 14:
-        case 15:
-        case 16:   return IGFX_XE_HP_CORE;
-        case 17:
-        case 18:
-        case 19:
-        case 20:
-        case 21:
-        case 22:
-        case 23:
-        case 24:
-        case 25:
-        case 26:
-        case 27:
-        case 28:
-        case 29:   return IGFX_XE_HPC_CORE;
-        case 30:
-        case 31:
-	default: break;
-        }
-        return IGFX_GEN9_CORE;
-    }
-
-    // To simulate the UMDs/ClinentContexts per adapter i.e MAX_COUNT_PER_ADAPTER
-    // Increase MAX_COUNT_PER_ADAPTER value if there are more UMDs involved.
-    static GMM_CLIENT GetClientType(uint32_t CountIdx)
-    {
-        switch (CountIdx)
-        {
-        case 0:   return GMM_D3D9_VISTA;
-        case 1:   return GMM_D3D10_VISTA;
-        case 2:   return GMM_D3D12_VISTA;
-	case 3:   return GMM_EXCITE_VISTA;
-	case 4:   return GMM_OCL_VISTA;
-        default: break;
-        }
-        return GMM_D3D9_VISTA;
-    }
-
-    // Returns the AdpaterSaved array value, Adapter BDFs based on input AdapterIdx.
-
-    static ADAPTER_BDF GetAdapterBDF(uint32_t AdapterIdx)
-    {
-        ADAPTER_BDF AdapterBDF={0,2,0,0};
-
-        if(AdapterIdx < MAX_NUM_ADAPTERS)
-        {
-            AdapterBDF.Bus      = AdpaterSaved[AdapterIdx].Bus;
-            AdapterBDF.Device   = AdpaterSaved[AdapterIdx].Device;
-            AdapterBDF.Function = AdpaterSaved[AdapterIdx].Function;
-	}
-        return AdapterBDF;
-    }
+    ADAPTER_BDF AdapterSaved[MAX_NUM_ADAPTERS];
 };
 
 typedef MACommonULT GMM_MA_ULT_CONTEXT;
 
+typedef struct ThreadInParams_Rec
+{
+    uint32_t AdapterIdx;
+    uint32_t CountIdx;
+
+    GMM_MA_ULT_CONTEXT *MATestObj;
+} ThreadInParams;
+
 class CTestMA : public MACommonULT
 {
 public:
     CTestMA();
     ~CTestMA();
 
+    void SetUp() override;
+    void TearDown() override;
+
     static void SetUpTestCase();
     static void TearDownTestCase();
-
 };
 
 #ifdef _WIN32
-    DWORD WINAPI Thread1(LPVOID lpParam);
+DWORD WINAPI MAULTThreadEntryFunc(LPVOID lpParam);
 #else
-    void *Thread1(void *lpParam);
+void *MAULTThreadEntryFunc(void *lpParam);
 #endif