VirtualBox

source: vbox/trunk/include/iprt/cpuset.h@ 8163

Last change on this file since 8163 was 8163, checked in by vboxsync, 17 years ago

rebrand IPRT

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1/** @file
2 * Incredibly Portable Runtime - CPU Set.
3 */
4
5/*
6 * Copyright (C) 2008 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___iprt_cpuset_h
31#define ___iprt_cpuset_h
32
33#include <iprt/types.h>
34#include <iprt/mp.h> /* RTMpCpuIdToSetIndex */
35
36
37__BEGIN_DECLS
38
39/** @defgroup grp_rt_mp RTCpuSet - CPU Set
40 * @ingroup grp_rt
41 * @{
42 */
43
44/**
45 * The maximum number of CPUs a set can contain and IPRT is able
46 * to reference.
47 * @remarks This is the maximum value of the supported platforms.
48 */
49#define RTCPUSET_MAX_CPUS 64
50
51/**
52 * Clear all CPUs.
53 *
54 * @returns pSet.
55 * @param pSet Pointer to the set.
56 */
57DECLINLINE(PRTCPUSET) RTCpuSetEmpty(PRTCPUSET pSet)
58{
59 *pSet = 0;
60 return pSet;
61}
62
63
64/**
65 * Set all CPUs.
66 *
67 * @returns pSet.
68 * @param pSet Pointer to the set.
69 */
70DECLINLINE(PRTCPUSET) RTCpuSetFill(PRTCPUSET pSet)
71{
72 *pSet = UINT64_MAX;
73 return pSet;
74}
75
76
77/**
78 * Adds a CPU given by it's identifier to the set.
79 *
80 * @returns 0 on success, -1 if idCpu isn't valid.
81 * @param pSet Pointer to the set.
82 * @param idCpu The identifier of the CPU to add.
83 */
84DECLINLINE(int) RTCpuSetAdd(PRTCPUSET pSet, RTCPUID idCpu)
85{
86 int iCpu = RTMpCpuIdToSetIndex(idCpu);
87 if (RT_UNLIKELY(iCpu < 0))
88 return -1;
89 *pSet |= RT_BIT_64(iCpu);
90 return 0;
91}
92
93
94/**
95 * Removes a CPU given by it's identifier from the set.
96 *
97 * @returns 0 on success, -1 if idCpu isn't valid.
98 * @param pSet Pointer to the set.
99 * @param idCpu The identifier of the CPU to delete.
100 */
101DECLINLINE(int) RTCpuSetDel(PRTCPUSET pSet, RTCPUID idCpu)
102{
103 int iCpu = RTMpCpuIdToSetIndex(idCpu);
104 if (RT_UNLIKELY(iCpu < 0))
105 return -1;
106 *pSet &= ~RT_BIT_64(iCpu);
107 return 0;
108}
109
110
111/**
112 * Checks if a CPU given by it's identifier is a member of the set.
113 *
114 * @returns true / false accordingly.
115 * @param pSet Pointer to the set.
116 * @param idCpu The identifier of the CPU to look for.
117 */
118DECLINLINE(bool) RTCpuSetIsMember(PCRTCPUSET pSet, RTCPUID idCpu)
119{
120 int iCpu = RTMpCpuIdToSetIndex(idCpu);
121 if (RT_UNLIKELY(iCpu < 0))
122 return false;
123 return !!(*pSet & RT_BIT_64(iCpu));
124}
125
126
127/**
128 * Converts the CPU set to a 64-bit mask.
129 *
130 * @returns The mask.
131 * @param pSet Pointer to the set.
132 */
133DECLINLINE(uint64_t) RTCpuSetToU64(PCRTCPUSET pSet)
134{
135 return *pSet;
136}
137
138
139/**
140 * Initializes the CPU set from a 64-bit mask.
141 *
142 * @param pSet Pointer to the set.
143 * @param fMask The mask.
144 */
145DECLINLINE(PRTCPUSET) RTCpuSetFromU64(PRTCPUSET pSet, uint64_t fMask)
146{
147 *pSet = fMask;
148 return pSet;
149}
150
151
152/**
153 * Count the CPUs in the set.
154 *
155 * @returns CPU count.
156 * @param pSet Pointer to the set.
157 */
158DECLINLINE(RTCPUID) RTCpuSetCount(PRTCPUSET pSet)
159{
160 RTCPUID cCpus = 0;
161 RTCPUID iCpu = 64;
162 while (iCpu-- > 0)
163 if (*pSet & RT_BIT_64(iCpu))
164 cCpus++;
165 return cCpus;
166}
167
168
169/** @} */
170
171__END_DECLS
172
173#endif
174
175
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