VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstMp-1.cpp@ 21725

Last change on this file since 21725 was 21725, checked in by vboxsync, 15 years ago

iprt: Added RTMpGetDescription.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.1 KB
Line 
1/* $Id: tstMp-1.cpp 21725 2009-07-20 13:10:08Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTMp.
4 */
5
6/*
7 * Copyright (C) 2008 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/mp.h>
35#include <iprt/cpuset.h>
36#include <iprt/err.h>
37#include <iprt/initterm.h>
38#include <iprt/stream.h>
39#include <iprt/string.h>
40
41
42/*******************************************************************************
43* Global Variables *
44*******************************************************************************/
45static unsigned g_cErrors = 0;
46
47
48int main()
49{
50 RTR3Init();
51 RTPrintf("tstMp-1: TESTING...\n");
52
53 /*
54 * Present and possible CPUs.
55 */
56 RTCPUID cCpus = RTMpGetCount();
57 if (cCpus > 0)
58 RTPrintf("tstMp-1: RTMpGetCount -> %d\n", (int)cCpus);
59 else
60 {
61 RTPrintf("tstMp-1: FAILURE: RTMpGetCount -> %d\n", (int)cCpus);
62 g_cErrors++;
63 cCpus = 1;
64 }
65
66 RTCPUSET Set;
67 PRTCPUSET pSet = RTMpGetSet(&Set);
68 if (pSet == &Set)
69 {
70 if ((RTCPUID)RTCpuSetCount(&Set) != cCpus)
71 {
72 RTPrintf("tstMp-1: FAILURE: RTMpGetSet returned a set with a different cpu count; %d, expected %d\n",
73 RTCpuSetCount(&Set), cCpus);
74 g_cErrors++;
75 }
76 RTPrintf("tstMp-1: Possible CPU mask:\n");
77 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
78 {
79 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
80 if (RTCpuSetIsMemberByIndex(&Set, iCpu))
81 {
82 RTPrintf("tstMp-1: %2d - id %d: %u/%u MHz", iCpu, (int)idCpu,
83 RTMpGetCurFrequency(idCpu), RTMpGetMaxFrequency(idCpu));
84 if (RTMpIsCpuPresent(idCpu))
85 RTPrintf(RTMpIsCpuOnline(idCpu) ? " online\n" : " offline\n");
86 else
87 {
88 if (!RTMpIsCpuOnline(idCpu))
89 RTPrintf(" absent\n");
90 else
91 {
92 RTPrintf(" online but absent!\n");
93 RTPrintf("tstMp-1: FAILURE: Cpu with index %d is report as !RTIsCpuPresent while RTIsCpuOnline returns true!\n", iCpu);
94 g_cErrors++;
95 }
96 }
97 if (!RTMpIsCpuPossible(idCpu))
98 {
99 RTPrintf("tstMp-1: FAILURE: Cpu with index %d is returned by RTCpuSet but not RTMpIsCpuPossible!\n", iCpu);
100 g_cErrors++;
101 }
102 }
103 else if (RTMpIsCpuPossible(idCpu))
104 {
105 RTPrintf("tstMp-1: FAILURE: Cpu with index %d is returned by RTMpIsCpuPossible but not RTCpuSet!\n", iCpu);
106 g_cErrors++;
107 }
108 else if (RTMpGetCurFrequency(idCpu) != 0)
109 {
110 RTPrintf("tstMp-1: FAILURE: RTMpGetCurFrequency(%d[idx=%d]) didn't return 0 as it should\n", (int)idCpu, iCpu);
111 g_cErrors++;
112 }
113 else if (RTMpGetMaxFrequency(idCpu) != 0)
114 {
115 RTPrintf("tstMp-1: FAILURE: RTMpGetCurFrequency(%d[idx=%d]) didn't return 0 as it should\n", (int)idCpu, iCpu);
116 g_cErrors++;
117 }
118 }
119 }
120 else
121 {
122 RTPrintf("tstMp-1: FAILURE: RTMpGetSet -> %p, expected %p\n", pSet, &Set);
123 g_cErrors++;
124 RTCpuSetEmpty(&Set);
125 RTCpuSetAdd(&Set, RTMpCpuIdFromSetIndex(0));
126 }
127
128 /*
129 * Online CPUs.
130 */
131 RTCPUID cCpusOnline = RTMpGetOnlineCount();
132 if (cCpusOnline > 0)
133 {
134 if (cCpusOnline <= cCpus)
135 RTPrintf("tstMp-1: RTMpGetOnlineCount -> %d\n", (int)cCpusOnline);
136 else
137 {
138 RTPrintf("tstMp-1: FAILURE: RTMpGetOnlineCount -> %d, expected <= %d\n", (int)cCpusOnline, (int)cCpus);
139 g_cErrors++;
140 cCpusOnline = cCpus;
141 }
142 }
143 else
144 {
145 RTPrintf("tstMp-1: FAILURE: RTMpGetOnlineCount -> %d\n", (int)cCpusOnline);
146 g_cErrors++;
147 cCpusOnline = 1;
148 }
149
150 RTCPUSET SetOnline;
151 pSet = RTMpGetOnlineSet(&SetOnline);
152 if (pSet == &SetOnline)
153 {
154 if (RTCpuSetCount(&SetOnline) <= 0)
155 {
156 RTPrintf("tstMp-1: FAILURE: RTMpGetOnlineSet returned an empty set!\n");
157 g_cErrors++;
158 }
159 else if ((RTCPUID)RTCpuSetCount(&SetOnline) > cCpus)
160 {
161 RTPrintf("tstMp-1: FAILURE: RTMpGetOnlineSet returned a too high value; %d, expected <= %d\n",
162 RTCpuSetCount(&SetOnline), cCpus);
163 g_cErrors++;
164 }
165 RTPrintf("tstMp-1: Online CPU mask:\n");
166 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
167 if (RTCpuSetIsMemberByIndex(&SetOnline, iCpu))
168 {
169 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
170 RTPrintf("tstMp-1: %2d - id %d: %u/%u MHz %s\n", iCpu, (int)idCpu, RTMpGetCurFrequency(idCpu),
171 RTMpGetMaxFrequency(idCpu), RTMpIsCpuOnline(idCpu) ? "online" : "offline");
172 if (!RTCpuSetIsMemberByIndex(&Set, iCpu))
173 {
174 RTPrintf("tstMp-1: FAILURE: online cpu with index %2d is not a member of the possible cpu set!\n", iCpu);
175 g_cErrors++;
176 }
177 }
178
179 /* There isn't any sane way of testing RTMpIsCpuOnline really... :-/ */
180 }
181 else
182 {
183 RTPrintf("tstMp-1: FAILURE: RTMpGetOnlineSet -> %p, expected %p\n", pSet, &Set);
184 g_cErrors++;
185 }
186
187 /*
188 * Present CPUs.
189 */
190 RTCPUID cCpusPresent = RTMpGetPresentCount();
191 if (cCpusPresent > 0)
192 {
193 if ( cCpusPresent <= cCpus
194 && cCpusPresent >= cCpusOnline)
195 RTPrintf("tstMp-1: RTMpGetPresentCount -> %d\n", (int)cCpusPresent);
196 else
197 {
198 RTPrintf("tstMp-1: FAILURE: RTMpGetPresentCount -> %d, expected <= %d and >= %d\n", (int)cCpusPresent, (int)cCpus, (int)cCpusOnline);
199 g_cErrors++;
200 }
201 }
202 else
203 {
204 RTPrintf("tstMp-1: FAILURE: RTMpGetPresentCount -> %d\n", (int)cCpusPresent);
205 g_cErrors++;
206 cCpusPresent = 1;
207 }
208
209 RTCPUSET SetPresent;
210 pSet = RTMpGetPresentSet(&SetPresent);
211 if (pSet == &SetPresent)
212 {
213 if (RTCpuSetCount(&SetPresent) <= 0)
214 {
215 RTPrintf("tstMp-1: FAILURE: RTMpGetPresentSet returned an empty set!\n");
216 g_cErrors++;
217 }
218 else if ((RTCPUID)RTCpuSetCount(&SetPresent) != cCpusPresent)
219 {
220 RTPrintf("tstMp-1: FAILURE: RTMpGetPresentSet returned a bad value; %d, expected = %d\n",
221 RTCpuSetCount(&SetPresent), cCpusPresent);
222 g_cErrors++;
223 }
224 RTPrintf("tstMp-1: Present CPU mask:\n");
225 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
226 if (RTCpuSetIsMemberByIndex(&SetPresent, iCpu))
227 {
228 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
229 RTPrintf("tstMp-1: %2d - id %d: %u/%u MHz %s\n", iCpu, (int)idCpu, RTMpGetCurFrequency(idCpu),
230 RTMpGetMaxFrequency(idCpu), RTMpIsCpuPresent(idCpu) ? "present" : "absent");
231 if (!RTCpuSetIsMemberByIndex(&Set, iCpu))
232 {
233 RTPrintf("tstMp-1: FAILURE: online cpu with index %2d is not a member of the possible cpu set!\n", iCpu);
234 g_cErrors++;
235 }
236 }
237
238 /* There isn't any sane way of testing RTMpIsCpuPresent really... :-/ */
239 }
240 else
241 {
242 RTPrintf("tstMp-1: FAILURE: RTMpGetPresentSet -> %p, expected %p\n", pSet, &Set);
243 g_cErrors++;
244 }
245
246
247 /* Find an online cpu for the next test. */
248 RTCPUID idCpuOnline;
249 for (idCpuOnline = 0; idCpuOnline < RTCPUSET_MAX_CPUS; idCpuOnline++)
250 if (RTMpIsCpuOnline(idCpuOnline))
251 break;
252
253 /*
254 * Quick test of RTMpGetDescription.
255 */
256 char szBuf[64];
257 int rc = RTMpGetDescription(idCpuOnline, &szBuf[0], sizeof(szBuf));
258 if (RT_SUCCESS(rc))
259 {
260 RTPrintf("tstMp-1: RTMpGetDescription -> '%s'\n", szBuf);
261
262 size_t cch = strlen(szBuf);
263 rc = RTMpGetDescription(idCpuOnline, &szBuf[0], cch);
264 if (rc != VERR_BUFFER_OVERFLOW)
265 {
266 RTPrintf("tstMp-1: FAILURE: RTMpGetDescription -> %Rrc, expected VERR_BUFFER_OVERFLOW\n", rc);
267 g_cErrors++;
268 }
269 rc = RTMpGetDescription(idCpuOnline, &szBuf[0], cch + 1);
270 if (RT_FAILURE(rc))
271 {
272 RTPrintf("tstMp-1: FAILURE: RTMpGetDescription -> %Rrc, expected VINF_SUCCESS\n", rc);
273 g_cErrors++;
274 }
275 }
276 else
277 {
278 RTPrintf("tstMp-1: FAILURE: RTMpGetDescription -> %Rrc\n", rc);
279 g_cErrors++;
280 }
281
282
283 if (!g_cErrors)
284 RTPrintf("tstMp-1: SUCCESS\n", g_cErrors);
285 else
286 RTPrintf("tstMp-1: FAILURE - %d errors\n", g_cErrors);
287 return !!g_cErrors;
288}
289
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