summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/threading/WaitForMultipleObjects/test2/test2.c
blob: 057df66a7048315ba818269e3140c9c2b39cacb3 (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
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information. 
//

/*============================================================================
**
** Source:  test1.c
**
** Purpose: Test to ensure that WaitForMultipleObjects() performs
**          as expected when called with an INFINITE timeout.
**
**
**==========================================================================*/
#include <palsuite.h>

/* global data */
static BOOL   bEventSet = FALSE;
static HANDLE hEvent = NULL;


/* handler function */
static BOOL PALAPI CtrlHandler( DWORD CtrlType )
{
    if( CtrlType == CTRL_C_EVENT )
    {
        if( hEvent != NULL )
        {
            bEventSet = TRUE;
            if( ! SetEvent( hEvent ) )
            {
                Fail( "ERROR:%lu:SetEvent call failed", GetLastError() );
            }
        }
        return TRUE;
    }

    return FALSE;
}


/* main entry point function */
int __cdecl main( int argc, char **argv )

{
    /* local variables */
    BOOL    ret = FAIL;
    DWORD   dwRet;


    /* PAL initialization */
    if( (PAL_Initialize(argc, argv)) != 0 )
    {
        return( FAIL );
    }


    /* set the console control handler function */
    if( ! SetConsoleCtrlHandler( CtrlHandler, TRUE ) )
    {
        ret = FAIL;
        Trace( "ERROR:%lu:SetConsoleCtrlHandler() failed to add "
                "CtrlHandler\n",
                GetLastError() );
        goto done;
    }


    /* create a manual-reset event on which to wait */
    hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    if( hEvent == NULL )
    {
        Trace( "ERROR:%lu:CreateEvent() call failed\n", GetLastError() );
        goto done;
    }

    /* helpful instructions */
    Trace( "This program is designed to test WaitForMultipleObjects using\n"
            "a timeout value of INFINITE, and consequently it's expected\n"
            "to run forever, waiting and waiting. Press CTRL-C when you feel\n"
            "you've sufficiently approximated infinity to end the test.\n" );

    /* wait on the event forever, until the user stops the program */
    dwRet = WaitForMultipleObjects( 1, &hEvent, TRUE, INFINITE );
    if( dwRet != WAIT_OBJECT_0 )
    {
        Trace( "ERROR:WaitForMultipleObjects returned %lu, "
                "expected WAIT_OBJECT_0\n",
                dwRet );
        goto done;
    }

    /* verify that the bEventSet flag has been set */
    if( ! bEventSet )
    {
        Trace( "ERROR:WaitForMultipleObjects returned WAIT_OBJECT_0 "
                "but the event was never set\n" );
        goto done;
    }

    /* success if we get here */
    ret = PASS;


done:
    /* close our event handle */
    if( hEvent != NULL )
    {
        if( ! CloseHandle( hEvent ) )
        {
            Trace( "ERROR:%lu:CloseHandle call failed\n", GetLastError() );
            ret = FAIL;
        }
    }

    /* unset the control handle that was set */
    if( ! SetConsoleCtrlHandler( CtrlHandler, FALSE ) )
    {
        ret = FAIL;
        Trace( "ERROR:%lu:SetConsoleCtrlHandler() failed to "
                "remove CtrlHandler\n",
                GetLastError() );
    }

    /* check for failure */
    if( ret == FAIL )
    {
        Fail( "test failed\n" );
    }


    /* PAL termination */
    PAL_Terminate();


    /* return success */
    return PASS;
}