summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/threading/CreateThread/test1/test1.cpp
blob: 4084e1f9cf741883587c6ab6ccfb916cdd5e0748 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// 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: Test for CreateThread.  Call CreateThread and ensure
** that it succeeds.  Also check to ensure the paramater is passed
** properly.
**
**
**=========================================================*/

#include <palsuite.h>

#define LLFORMAT "%llu"

ULONGLONG dwCreateThreadTestParameter = 0;

DWORD PALAPI CreateThreadTestThread( LPVOID lpParameter)
{
    DWORD dwRet = 0;
    
    /* save parameter for test */
    dwCreateThreadTestParameter = (ULONGLONG)lpParameter;
    
    return dwRet;
}

BOOL CreateThreadTest()
{
    BOOL bRet = FALSE;
    DWORD dwRet = 0;

    LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
    DWORD dwStackSize = 0; 
    LPTHREAD_START_ROUTINE lpStartAddress =  &CreateThreadTestThread;
    LPVOID lpParameter = (LPVOID)lpStartAddress;
    DWORD dwCreationFlags = 0;  /* run immediately */
    DWORD dwThreadId = 0;

    HANDLE hThread = 0;

    dwCreateThreadTestParameter = 0;

    /* Create a thread, passing the appropriate paramaters as declared
       above.
    */
    
    hThread = CreateThread( lpThreadAttributes,   
                            dwStackSize,          
                            lpStartAddress,       
                            lpParameter,          
                            dwCreationFlags,      
                            &dwThreadId );       
    
    /* Ensure that the HANDLE is not invalid! */
    if (hThread != INVALID_HANDLE_VALUE)
    {
        dwRet = WaitForSingleObject(hThread,INFINITE);

        if (dwRet != WAIT_OBJECT_0)
        {
            Trace("CreateThreadTest:WaitForSingleObject "
                   "failed (%x)\n",GetLastError());
        }
        else
        {
            /* Check to ensure that the parameter passed to the thread
               function is the same in the function as what we passed.
            */
            
            if (dwCreateThreadTestParameter != (ULONGLONG)lpParameter)
            {
                Trace("CreateThreadTest:parameter error.  The "
                       "parameter passed should have been " LLFORMAT " but when "
                       "passed to the Thread function it was " LLFORMAT " . GetLastError[%x]\n",
                       dwCreateThreadTestParameter,lpParameter, GetLastError());
            }
            else
            {
                bRet = TRUE;
            }

        }
	CloseHandle(hThread);
    }
    else
    {
        Trace("CreateThreadTest:CreateThread failed (%x)\n",GetLastError());
    }

    return bRet; 
}


int __cdecl main(int argc, char **argv)
{
    if(0 != (PAL_Initialize(argc, argv)))
    {
        return ( FAIL );
    }
    
    if(!CreateThreadTest()) 
    {
        Fail ("Test failed\n");
    }
      
    Trace("Test Passed\n");
    PAL_Terminate();
    return ( PASS );

}