~ubuntu-branches/ubuntu/trusty/virtualbox-ose/trusty

« back to all changes in this revision

Viewing changes to src/VBox/Runtime/testcase/tstSemEvent.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2009-12-18 16:44:29 UTC
  • mfrom: (0.3.3 upstream) (0.4.6 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091218164429-jd34ccexpv5na11a
Tags: 3.1.2-dfsg-1ubuntu1
* Merge from Debian unstable (LP: #498219), remaining changes:
  - Disable update action
    - debian/patches/u01-disable-update-action.dpatch
  - VirtualBox should go in Accessories, not in System tools (LP: #288590)
    - debian/virtualbox-ose-qt.files/virtualbox-ose.desktop
  - Add Apport hook
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Add Launchpad integration
    - debian/control
    - debian/lpi-bug.xpm
    - debian/patches/u02-lp-integration.dpatch
* Fixes the following bugs:
  - Kernel module fails to build with Linux >= 2.6.32 (LP: #474625)
  - X.Org drivers need to be rebuilt against X-Server 1.7 (LP: #495935)
  - The *-source packages try to build the kernel modules even though the
    kernel headers aren't available (LP: #473334)
* Replace *-source packages with transitional packages for *-dkms.
* Adapt u01-disable-update-action.dpatch and u02-lp-integration.dpatch for
  new upstream version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: tstSemEvent.cpp $ */
 
2
/** @file
 
3
 * IPRT Testcase - Event Semaphore Test.
 
4
 */
 
5
 
 
6
/*
 
7
 * Copyright (C) 2009 Sun Microsystems, Inc.
 
8
 *
 
9
 * This file is part of VirtualBox Open Source Edition (OSE), as
 
10
 * available from http://www.virtualbox.org. This file is free software;
 
11
 * you can redistribute it and/or modify it under the terms of the GNU
 
12
 * General Public License (GPL) as published by the Free Software
 
13
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 
14
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 
15
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 
16
 *
 
17
 * The contents of this file may alternatively be used under the terms
 
18
 * of the Common Development and Distribution License Version 1.0
 
19
 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
 
20
 * VirtualBox OSE distribution, in which case the provisions of the
 
21
 * CDDL are applicable instead of those of the GPL.
 
22
 *
 
23
 * You may elect to license modified versions of this file under the
 
24
 * terms and conditions of either the GPL or the CDDL or both.
 
25
 *
 
26
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 
27
 * Clara, CA 95054 USA or visit http://www.sun.com if you need
 
28
 * additional information or have any questions.
 
29
 */
 
30
 
 
31
/*******************************************************************************
 
32
*   Header Files                                                               *
 
33
*******************************************************************************/
 
34
#include <iprt/semaphore.h>
 
35
#include <iprt/string.h>
 
36
#include <iprt/thread.h>
 
37
#include <iprt/stream.h>
 
38
#include <iprt/time.h>
 
39
#include <iprt/initterm.h>
 
40
#include <iprt/rand.h>
 
41
#include <iprt/asm.h>
 
42
#include <iprt/assert.h>
 
43
 
 
44
 
 
45
/*******************************************************************************
 
46
*   Global Variables                                                           *
 
47
*******************************************************************************/
 
48
static RTSEMEVENTMULTI      g_hSemEM = NIL_RTSEMEVENTMULTI;
 
49
static uint32_t volatile    g_cErrors;
 
50
 
 
51
 
 
52
int PrintError(const char *pszFormat, ...)
 
53
{
 
54
    ASMAtomicIncU32(&g_cErrors);
 
55
 
 
56
    RTPrintf("tstSemEvent: FAILURE - ");
 
57
    va_list va;
 
58
    va_start(va, pszFormat);
 
59
    RTPrintfV(pszFormat, va);
 
60
    va_end(va);
 
61
 
 
62
    return 1;
 
63
}
 
64
 
 
65
 
 
66
int ThreadTest1(RTTHREAD ThreadSelf, void *pvUser)
 
67
{
 
68
    int rc;
 
69
    rc = RTSemEventMultiWait(g_hSemEM, 1000);
 
70
    if (rc != VERR_TIMEOUT)
 
71
    {
 
72
        PrintError("Thread 1: unexpected result of first RTSemEventMultiWait %Rrc\n", rc);
 
73
        return VINF_SUCCESS;
 
74
    }
 
75
 
 
76
    rc = RTSemEventMultiWait(g_hSemEM, 1000);
 
77
    if (RT_FAILURE(rc))
 
78
    {
 
79
        PrintError("Thread 1: unexpected result of second RTSemEventMultiWait %Rrc\n", rc);
 
80
        return VINF_SUCCESS;
 
81
    }
 
82
 
 
83
    RTPrintf("tstSemEvent: Thread 1 normal exit...\n");
 
84
    return VINF_SUCCESS;
 
85
}
 
86
 
 
87
 
 
88
int ThreadTest2(RTTHREAD ThreadSelf, void *pvUser)
 
89
{
 
90
    int rc;
 
91
    rc = RTSemEventMultiWait(g_hSemEM, RT_INDEFINITE_WAIT);
 
92
    if (RT_FAILURE(rc))
 
93
    {
 
94
        PrintError("Thread 2: unexpected result of RTSemEventMultiWait %Rrc\n", rc);
 
95
        return VINF_SUCCESS;
 
96
    }
 
97
 
 
98
    RTPrintf("tstSemEvent: Thread 2 normal exit...\n");
 
99
    return VINF_SUCCESS;
 
100
}
 
101
 
 
102
 
 
103
static int Test1()
 
104
{
 
105
    int rc;
 
106
    RTTHREAD Thread1, Thread2;
 
107
 
 
108
    rc = RTSemEventMultiCreate(&g_hSemEM);
 
109
    if (RT_FAILURE(rc))
 
110
        return PrintError("RTSemEventMultiCreate failed (rc=%Rrc)\n", rc);
 
111
 
 
112
    /*
 
113
     * Create the threads and let them block on the event multi semaphore.
 
114
     */
 
115
    rc = RTSemEventMultiReset(g_hSemEM);
 
116
    if (RT_FAILURE(rc))
 
117
        return PrintError("RTSemEventMultiReset failed (rc=%Rrc)\n", rc);
 
118
 
 
119
    rc = RTThreadCreate(&Thread2, ThreadTest2, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "test2");
 
120
    if (RT_FAILURE(rc))
 
121
        return PrintError("RTThreadCreate failed for thread 2 (rc=%Rrc)\n", rc);
 
122
    RTThreadSleep(100);
 
123
 
 
124
    rc = RTThreadCreate(&Thread1, ThreadTest1, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "test1");
 
125
    if (RT_FAILURE(rc))
 
126
        return PrintError("RTThreadCreate failed for thread 1 (rc=%Rrc)\n", rc);
 
127
 
 
128
    /* Force first thread (which has a timeout of 1 second) to timeout in the
 
129
     * first wait, and the second wait will succeed. */
 
130
    RTThreadSleep(1500);
 
131
    rc = RTSemEventMultiSignal(g_hSemEM);
 
132
    if (RT_FAILURE(rc))
 
133
        PrintError("RTSemEventMultiSignal failed (rc=%Rrc)\n", rc);
 
134
 
 
135
    rc = RTThreadWait(Thread1, 1000, NULL);
 
136
    if (RT_FAILURE(rc))
 
137
        PrintError("RTThreadWait failed for thread 1 (rc=%Rrc)\n", rc);
 
138
 
 
139
    rc = RTThreadWait(Thread2, 1000, NULL);
 
140
    if (RT_FAILURE(rc))
 
141
        PrintError("RTThreadWait failed for thread 2 (rc=%Rrc)\n", rc);
 
142
 
 
143
    rc = RTSemEventMultiDestroy(g_hSemEM);
 
144
    if (RT_FAILURE(rc))
 
145
        PrintError("RTSemEventMultiDestroy failed - %Rrc\n", rc);
 
146
    g_hSemEM = NIL_RTSEMEVENTMULTI;
 
147
    if (g_cErrors)
 
148
        RTThreadSleep(100);
 
149
    return 0;
 
150
}
 
151
 
 
152
 
 
153
int main(int argc, char **argv)
 
154
{
 
155
    int rc = RTR3Init();
 
156
    if (RT_FAILURE(rc))
 
157
    {
 
158
        RTPrintf("tstSemEvent: RTR3Init failed (rc=%Rrc)\n", rc);
 
159
        return 1;
 
160
    }
 
161
    RTPrintf("tstSemEvent: TESTING...\n");
 
162
    Test1();
 
163
 
 
164
    if (!g_cErrors)
 
165
        RTPrintf("tstSemEvent: SUCCESS\n");
 
166
    else
 
167
        RTPrintf("tstSemEvent: FAILURE - %u errors\n", g_cErrors);
 
168
    return g_cErrors != 0;
 
169
}
 
170