VirtualBox

source: vbox/trunk/include/iprt/mp.h@ 7706

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

RT_MP_MAX_CPU -> RTCPUSET_MAX_CPUS (/ MAXIMUM_PROCESSORS). Added the new RTMp functions to NT.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.8 KB
Line 
1/** @file
2 * innotek Portable Runtime - Multiprocessor.
3 */
4
5/*
6 * Copyright (C) 2008 innotek GmbH
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
26#ifndef ___iprt_mp_h
27#define ___iprt_mp_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31
32
33__BEGIN_DECLS
34
35/** @defgroup grp_rt_mp RTMp - Multiprocessor
36 * @ingroup grp_rt
37 * @{
38 */
39
40/**
41 * Gets the identifier of the CPU executing the call.
42 *
43 * When called from a system mode where scheduling is active, like ring-3 or
44 * kernel mode with interrupts enabled on some systems, no assumptions should
45 * be made about the current CPU when the call returns.
46 *
47 * @returns CPU Id.
48 */
49RTDECL(RTCPUID) RTMpCpuId(void);
50
51/**
52 * Converts a CPU identifier to a CPU set index.
53 *
54 * This may or may not validate the precense of the CPU.
55 *
56 * @returns The CPU set index on success, -1 on failure.
57 * @param idCpu The identifier of the CPU.
58 */
59RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu);
60
61/**
62 * Converts a CPU set index to a a CPU identifier.
63 *
64 * This may or may not validate the precense of the CPU, so, use
65 * RTMpDoesCpuExist for that.
66 *
67 * @returns The corresponding CPU identifier, NIL_RTCPUID on failure.
68 * @param iCpu The CPU set index.
69 */
70RTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu);
71
72/**
73 * Gets the max CPU identifier (inclusive).
74 *
75 * Inteded for brute force enumerations, but use with
76 * care as it may be expensive.
77 *
78 * @returns The current higest CPU identifier value.
79 */
80RTDECL(RTCPUID) RTMpGetMaxCpuId(void);
81
82/**
83 * Checks if a CPU is online or not.
84 *
85 * @returns true/false accordingly.
86 * @param idCpu The identifier of the CPU.
87 */
88RTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu);
89
90/**
91 * Checks if a CPU exist or not / validates a CPU id.
92 *
93 * @returns true/false accordingly.
94 * @param idCpu The identifier of the CPU.
95 */
96RTDECL(bool) RTMpDoesCpuExist(RTCPUID idCpu);
97
98/**
99 * Gets set of the CPUs present in the system.
100 *
101 * This may or may not validate the precense of the CPU, so, use
102 * RTMpDoesCpuExist for that.
103 *
104 * @returns pSet.
105 * @param pSet Where to put the set.
106 */
107RTDECL(PRTCPUSET) RTMpGetSet(PRTCPUSET pSet);
108
109/**
110 * Get the count of CPUs presetn in the system.
111 *
112 * @return The count.
113 */
114RTDECL(RTCPUID) RTMpGetCount(void);
115
116/**
117 * Gets set of the CPUs present that are currently online.
118 *
119 * @returns pSet.
120 * @param pSet Where to put the set.
121 */
122RTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet);
123
124/**
125 * Get the count of CPUs that are currently online.
126 *
127 * @return The count.
128 */
129RTDECL(RTCPUID) RTMpGetOnlineCount(void);
130
131
132#ifdef IN_RING0
133
134/**
135 * Worker function passed to RTMpOnAll, RTMpOnOthers and RTMpOnSpecific that
136 * is to be called on the target cpus.
137 *
138 * @param idCpu The identifier for the CPU the function is called on.
139 * @param pvUser1 The 1st user argument.
140 * @param pvUser2 The 2nd user argument.
141 */
142typedef DECLCALLBACK(void) FNRTMPWORKER(RTCPUID idCpu, void *pvUser1, void *pvUser2);
143/** Pointer to a FNRTMPWORKER. */
144typedef FNRTMPWORKER *PFNRTMPWORKER;
145
146/**
147 * Executes a function on each (online) CPU in the system.
148 *
149 * @returns IPRT status code.
150 * @retval VINF_SUCCESS on success.
151 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
152 *
153 * @param pfnWorker The worker function.
154 * @param pvUser1 The first user argument for the worker.
155 * @param pvUser2 The second user argument for the worker.
156 *
157 * @remarks The execution isn't in any way guaranteed to be simultaneous,
158 * it might even be serial (cpu by cpu).
159 */
160RTDECL(int) RTMpOnAll(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
161
162/**
163 * Executes a function on a all other (online) CPUs in the system.
164 *
165 * @returns IPRT status code.
166 * @retval VINF_SUCCESS on success.
167 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
168 *
169 * @param pfnWorker The worker function.
170 * @param pvUser1 The first user argument for the worker.
171 * @param pvUser2 The second user argument for the worker.
172 *
173 * @remarks The execution isn't in any way guaranteed to be simultaneous,
174 * it might even be serial (cpu by cpu).
175 */
176RTDECL(int) RTMpOnOthers(PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
177
178/**
179 * Executes a function on a specific CPU in the system.
180 *
181 * @returns IPRT status code.
182 * @retval VINF_SUCCESS on success.
183 * @retval VERR_NOT_SUPPORTED if this kind of operation isn't supported by the system.
184 * @retval VERR_CPU_OFFLINE if the CPU is offline.
185 * @retval VERR_CPU_NOT_FOUND if the CPU wasn't found.
186 *
187 * @param idCpu The id of the CPU.
188 * @param pfnWorker The worker function.
189 * @param pvUser1 The first user argument for the worker.
190 * @param pvUser2 The second user argument for the worker.
191 */
192RTDECL(int) RTMpOnSpecific(RTCPUID idCpu, PFNRTMPWORKER pfnWorker, void *pvUser1, void *pvUser2);
193
194#endif /* IN_RING0 */
195
196/** @} */
197
198__END_DECLS
199
200#endif
201
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