diff options
Diffstat (limited to 'src/pal/tests/palsuite/threading/DisableThreadLibraryCalls/test1/test1.cpp')
-rw-r--r-- | src/pal/tests/palsuite/threading/DisableThreadLibraryCalls/test1/test1.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/threading/DisableThreadLibraryCalls/test1/test1.cpp b/src/pal/tests/palsuite/threading/DisableThreadLibraryCalls/test1/test1.cpp new file mode 100644 index 0000000000..b64fd0c7d2 --- /dev/null +++ b/src/pal/tests/palsuite/threading/DisableThreadLibraryCalls/test1/test1.cpp @@ -0,0 +1,145 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*===================================================================== +** +** Source: test1.c +** +** Purpose: Tests that DisableThreadLibraryCalls actually stops thread +** attach/detach notifications to a library. Also tests how it +** handles an invalid module handle. +** +** +**===================================================================*/ + +#include <palsuite.h> + + +/* SHLEXT is defined only for Unix variants */ + +#if defined(SHLEXT) +#define LibName "testlib"SHLEXT +#define GETCALLCOUNT "GetCallCount" +#else +#define LibName "testlib" +#define GETCALLCOUNT "_GetCallCount@0" +#endif + +DWORD __stdcall ThreadFunc(LPVOID lpParam); +int RunTest(int DisableThreadCalls); + +int __cdecl main(int argc, char **argv) +{ + int ret; + + if ((PAL_Initialize(argc,argv)) != 0) + { + return (FAIL); + } + + + /* + * Although MSDN says that DisableThreadLibraryCalls will fail if passed + * an invalid handle, it actually returns success! + */ + ret = DisableThreadLibraryCalls(NULL); + if (!ret) + { + Fail("DisableThreadLibraryCalls failed on an invalid module " + "handle (it actually should pass)!\n"); + } + + + /* + * Test once without calling DisableThreadLibraryCalls and make sure we + * get expected results. + */ + ret = RunTest(0); + if (ret != 2) + { + Fail("Expected to get 2 thread library calls, got %d!\n", ret); + } + + + /* + * Test again, this time calling DisableThreadLibraryCalls. + */ + ret = RunTest(1); + if (ret != 0) + { + Fail("Expected to get 0 thread library calls, got %d!\n", ret); + } + + PAL_Terminate(); + return PASS; +} + +/* + * Thread entry point. Doesn't do anything. + */ +DWORD __stdcall ThreadFunc(LPVOID lpParam) +{ + return 0; +} + + +int RunTest(int DisableThreadCalls) +{ + HMODULE LibMod; + HANDLE hThread; + DWORD threadID; + DWORD WaitRet; + int (*GetCallCount)(); + int count; + + LibMod = LoadLibrary(LibName); + if (LibMod == NULL) + { + Fail("Unable to load test library!\nGetLastError returned %d\n", + GetLastError()); + } + + GetCallCount = (int(*)())GetProcAddress(LibMod, GETCALLCOUNT); + if (GetCallCount == NULL) + { + Fail("Unable to get function GetCallCount from library!\n" + "GetLastError returned %d\n", GetLastError()); + } + + if (DisableThreadCalls) + { + if (!DisableThreadLibraryCalls(LibMod)) + { + Fail("DisabledThreadLibraryCalls failed!\n" + "GetLastError returned %d!\n", GetLastError()); + } + } + + hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc, + NULL, 0, &threadID); + + if (hThread == NULL) + { + Fail("Unable to create a thread!\n"); + } + + WaitRet = WaitForSingleObject(hThread, INFINITE); + if (WaitRet == WAIT_FAILED) + { + Fail("Unable to wait on thread!\nGetLastError returned %d\n", + GetLastError()); + } + + count = GetCallCount(); + + CloseHandle(hThread); + + if (!FreeLibrary(LibMod)) + { + Fail("Failed freeing library!\nGetLastError returned %d\n", + GetLastError()); + } + + return count; +} |