| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- ///////////////////////////////////////////////////////////////////////////////
- // Copyright (c) Electronic Arts Inc. All rights reserved.
- ///////////////////////////////////////////////////////////////////////////////
- #include <EATest/EATest.h>
- #include <eathread/eathread.h>
- #include <eathread/eathread_atomic.h>
- #include <eathread/eathread_thread.h>
- #include <EAStdC/EAString.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <EAMain/EAEntryPointMain.inl>
- ///////////////////////////////////////////////////////////////////////////////
- // operator new
- // EASTL requires the following new operators to be defined.
- //
- void* operator new[](size_t size, const char*, int, unsigned, const char*, int)
- {
- return new char[size];
- }
- void* operator new[](size_t size, size_t, size_t, const char*, int, unsigned, const char*, int)
- {
- return new char[size];
- }
- const int NUM_THREADS = 5;
- ///////////////////////////////////////////////////////////////////////////////
- // Structure where a single instance is passed to every active thread.
- //
- struct GlobalData
- {
- EA::Thread::AtomicInt32 i;
- GlobalData()
- : i(0)
- {}
- };
- typedef void (*DLL_ENTRY)(GlobalData*);
- ///////////////////////////////////////////////////////////////////////////////
- // Thread Entry
- //
- intptr_t ThreadFunction(void* pData)
- {
- GlobalData* const pGlobalData = static_cast<GlobalData*>(pData);
- while(!pGlobalData->i)
- {
- EA::Thread::ThreadSleep(50);
- }
- return 0;
- }
- ///////////////////////////////////////////////////////////////////////////////
- // The function export below MUST be here as it forces lib files to be
- // generated for the DLL's being built.
- //
- extern "C"
- EA_EXPORT void ForceLibFilesToBeGenerated(GlobalData* pGlobal)
- {
- using namespace EA::Thread;
- using namespace EA::UnitTest;
- // Start two threads in this DLL instance
- Thread thread;
- for(size_t i = 0; i < NUM_THREADS; i++)
- thread.Begin(ThreadFunction, pGlobal);
-
- // Get the number of threads in the system
- ThreadEnumData enumData[32];
- size_t count = EnumerateThreads(enumData, EAArrayCount(enumData));
- //Report("Number of DLL threads detected: %d\n", count);
- for(size_t i = 0; i < count; i++)
- enumData[i].Release();
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Main
- //
- int EAMain(int argc, char** argv)
- {
- using namespace EA::Thread;
- using namespace EA::UnitTest;
- int nErrorCount = 0;
- GlobalData data;
- // TODO: DLL usage must be made portable through support at various levels of our technology stack.
- #if defined(EA_PLATFORM_MICROSOFT) && defined(EA_PLATFORM_WIN32)
- HINSTANCE__* mod1 = LoadLibrary("EAThreadTestDllSafetyMod1.dll");
- HINSTANCE__* mod2 = LoadLibrary("EAThreadTestDllSafetyMod2.dll");
- DLL_ENTRY dllmain1 = (DLL_ENTRY)GetProcAddress(mod1, "ForceLibFilesToBeGenerated");
- DLL_ENTRY dllmain2 = (DLL_ENTRY)GetProcAddress(mod2, "ForceLibFilesToBeGenerated");
- if(dllmain1 != NULL)
- dllmain1(&data);
- if(dllmain2 != NULL)
- dllmain2(&data);
- #endif
- EA::EAMain::PlatformStartup();
- {
- // Start n threads in this DLL instance
- Thread thread;
- for(size_t i = 0; i < NUM_THREADS; i++)
- thread.Begin(ThreadFunction, &data);
-
- // Get the number of threads in the system and validate.
- ThreadEnumData enumData[32];
- size_t count = EnumerateThreads(enumData, EAArrayCount(enumData));
- Report("Number of threads detected: %d/%d. \n", count, NUM_THREADS*3);
- EATEST_VERIFY_MSG(count >= NUM_THREADS, "Thread tracking data isn't DLL safe. We are missing data generated in other DLL's.");
- for(size_t i = 0; i < count; i++)
- enumData[i].Release();
-
- // Release the threads
- data.i++;
- }
- EA::EAMain::PlatformShutdown(nErrorCount);
- #if defined(EA_PLATFORM_MICROSOFT) && defined(EA_PLATFORM_WIN32)
- FreeLibrary(mod1);
- FreeLibrary(mod2);
- #endif
- return nErrorCount;
- }
|