VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstSemPingPong.cpp@ 59665

Last change on this file since 59665 was 57358, checked in by vboxsync, 9 years ago

*: scm cleanup run.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 5.8 KB
Line 
1/* $Id: tstSemPingPong.cpp 57358 2015-08-14 15:16:38Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTSemPing/RTSemPong.
4 */
5
6/*
7 * Copyright (C) 2006-2015 Oracle Corporation
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
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/semaphore.h>
32#include <iprt/string.h>
33#include <iprt/stream.h>
34#include <iprt/initterm.h>
35#include <iprt/thread.h>
36#include <iprt/asm.h>
37
38
39/*********************************************************************************************************************************
40* Defined Constants And Macros *
41*********************************************************************************************************************************/
42#define TSTSEMPINGPONG_ITERATIONS 1000000
43
44
45/*********************************************************************************************************************************
46* Global Variables *
47*********************************************************************************************************************************/
48static volatile uint32_t g_cErrors = 0;
49
50static DECLCALLBACK(int) tstSemPingPongThread(RTTHREAD hThread, void *pvPP)
51{
52 int rc;
53 PRTPINGPONG pPP = (PRTPINGPONG)pvPP;
54 for (uint32_t i = 0; i < TSTSEMPINGPONG_ITERATIONS; i++)
55 {
56 if (!RTSemPongShouldWait(pPP))
57 {
58 ASMAtomicIncU32(&g_cErrors);
59 RTPrintf("tstSemPingPong: ERROR - RTSemPongShouldWait returned false before RTSemPongWait.\n");
60 }
61
62 rc = RTSemPongWait(pPP, RT_INDEFINITE_WAIT);
63 if (RT_FAILURE(rc))
64 {
65 ASMAtomicIncU32(&g_cErrors);
66 RTPrintf("tstSemPingPong: ERROR - RTSemPongWait -> %Rrc\n", rc);
67 break;
68 }
69
70 if (!RTSemPongIsSpeaker(pPP))
71 {
72 ASMAtomicIncU32(&g_cErrors);
73 RTPrintf("tstSemPingPong: ERROR - RTSemPongIsSpeaker returned false before RTSemPong.\n");
74 }
75
76 rc = RTSemPong(pPP);
77 if (RT_FAILURE(rc))
78 {
79 ASMAtomicIncU32(&g_cErrors);
80 RTPrintf("tstSemPingPong: ERROR - RTSemPong -> %Rrc\n", rc);
81 break;
82 }
83 }
84 return rc;
85}
86
87
88int main()
89{
90 RTR3InitExeNoArguments(0);
91
92 /*
93 * Create a ping pong and kick off a second thread which we'll
94 * exchange TSTSEMPINGPONG_ITERATIONS messages with.
95 */
96 RTPINGPONG PingPong;
97 int rc = RTSemPingPongInit(&PingPong);
98 if (RT_FAILURE(rc))
99 {
100 RTPrintf("tstSemPingPong: FATAL ERROR - RTSemPingPongInit -> %Rrc\n", rc);
101 return 1;
102 }
103
104 RTTHREAD hThread;
105 rc = RTThreadCreate(&hThread, tstSemPingPongThread, &PingPong, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "PONG");
106 if (RT_FAILURE(rc))
107 {
108 RTPrintf("tstSemPingPong: FATAL ERROR - RTSemPingPongInit -> %Rrc\n", rc);
109 return 1;
110 }
111
112 RTPrintf("tstSemPingPong: TESTING - %u iterations...\n", TSTSEMPINGPONG_ITERATIONS);
113 for (uint32_t i = 0; i < TSTSEMPINGPONG_ITERATIONS; i++)
114 {
115 if (!RTSemPingIsSpeaker(&PingPong))
116 {
117 ASMAtomicIncU32(&g_cErrors);
118 RTPrintf("tstSemPingPong: ERROR - RTSemPingIsSpeaker returned false before RTSemPing.\n");
119 }
120
121 rc = RTSemPing(&PingPong);
122 if (RT_FAILURE(rc))
123 {
124 ASMAtomicIncU32(&g_cErrors);
125 RTPrintf("tstSemPingPong: ERROR - RTSemPing -> %Rrc\n", rc);
126 break;
127 }
128
129 if (!RTSemPingShouldWait(&PingPong))
130 {
131 ASMAtomicIncU32(&g_cErrors);
132 RTPrintf("tstSemPingPong: ERROR - RTSemPingShouldWait returned false before RTSemPingWait.\n");
133 }
134
135 rc = RTSemPingWait(&PingPong, RT_INDEFINITE_WAIT);
136 if (RT_FAILURE(rc))
137 {
138 ASMAtomicIncU32(&g_cErrors);
139 RTPrintf("tstSemPingPong: ERROR - RTSemPingWait -> %Rrc\n", rc);
140 break;
141 }
142 }
143
144 int rcThread;
145 rc = RTThreadWait(hThread, 5000, &rcThread);
146 if (RT_FAILURE(rc))
147 {
148 ASMAtomicIncU32(&g_cErrors);
149 RTPrintf("tstSemPingPong: ERROR - RTSemPingWait -> %Rrc\n", rc);
150 }
151
152 rc = RTSemPingPongDelete(&PingPong);
153 if (RT_FAILURE(rc))
154 {
155 ASMAtomicIncU32(&g_cErrors);
156 RTPrintf("tstSemPingPong: ERROR - RTSemPingPongDestroy -> %Rrc\n", rc);
157 }
158
159 /*
160 * Summary.
161 */
162 uint32_t cErrors = ASMAtomicUoReadU32(&g_cErrors);
163 if (cErrors)
164 RTPrintf("tstSemPingPong: FAILED - %d errors\n", cErrors);
165 else
166 RTPrintf("tstSemPingPong: SUCCESS\n");
167 return cErrors ? 1 : 0;
168}
169
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette