summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/threading/ResumeThread/test1/test1.c
blob: 037f79f7a3b1459126353df8eb6cbf85edc777b2 (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// 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 ResumeThread.  Create a suspended Thread.
** First, ensure that it is indeed suspended.  Then call resumethread
** and check to ensure that the function has now run.
**
**
**=========================================================*/

#include <palsuite.h>

DWORD dwResumeThreadTestParameter = 0;

DWORD PALAPI ResumeThreadTestThread( LPVOID lpParameter)
{
    DWORD dwRet = 0;

    /* Save parameter so we can check and ensure this function ran
       properly.
    */
    
    dwResumeThreadTestParameter = (DWORD)lpParameter;

    return dwRet;
}

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

    LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
    DWORD dwStackSize = 0; 
    LPTHREAD_START_ROUTINE lpStartAddress =  &ResumeThreadTestThread;
    LPVOID lpParameter = lpStartAddress;
    DWORD dwCreationFlags = CREATE_SUSPENDED;
    DWORD dwThreadId = 0;

    HANDLE hThread = 0;

    dwResumeThreadTestParameter = 0;

    /* Create a thread, with CREATE_SUSPENDED, so we can resume it! */

    hThread = CreateThread( lpThreadAttributes, 
                            dwStackSize, lpStartAddress, lpParameter, 
                            dwCreationFlags, &dwThreadId ); 
    
    if (hThread != INVALID_HANDLE_VALUE)
    {
        /* Wait for one second.  This should return WAIT_TIMEOUT */
        dwRet = WaitForSingleObject(hThread,1000);

        if (dwRet != WAIT_TIMEOUT)
        {
            Trace("ResumeThreadTest:WaitForSingleObject "
                   "failed (%x)\n",GetLastError());
        }
        else
        {
            /* Check to ensure the parameter hasn't changed.  The
               function shouldn't have occurred yet.
            */
            if (dwResumeThreadTestParameter != 0)
            {
                Trace("ResumeThreadTest:parameter error\n");
            }
            else
            {
                /* Call ResumeThread and ensure the return value is
                   correct.
                */
                
                dwRet = ResumeThread(hThread);

                if (dwRet != 1)
                {
                    Trace("ResumeThreadTest:ResumeThread "
                           "failed (%x)\n",GetLastError());
                }
                else
                {
                    /* Wait again, now that the thread has been
                       resumed, and the return should be WAIT_OBJECT_0
                    */
                    dwRet = WaitForSingleObject(hThread,INFINITE);

                    if (dwRet != WAIT_OBJECT_0)
                    {
                        Trace("ResumeThreadTest:WaitForSingleObject "
                               "failed (%x)\n",GetLastError());
                    }
                    else
                    {
                        /* Check the param now and it should have been
                           set.
                        */
                        if (dwResumeThreadTestParameter != (DWORD)lpParameter)
                        {
                            Trace("ResumeThreadTest:parameter error\n");
                        }
                        else
                        {
                            bRet = TRUE;
                        }
                    }
                }
            }
        }
    }
    else
    {
        Trace("ResumeThreadTest:CreateThread failed (%x)\n",GetLastError());
    }

    return bRet; 
}

int __cdecl main(int argc, char **argv)
{

    if(0 != (PAL_Initialize(argc, argv)))
    {
	return ( FAIL );
    }

    if(!ResumeThreadTest())
    {
        Fail("Test Failed\n");
    }  

    PAL_Terminate();
    return (PASS);

}