Changeset 403 in vbox
- Timestamp:
- Jan 28, 2007 8:45:05 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 17974
- Location:
- trunk
- Files:
-
- 1 deleted
- 17 edited
- 3 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/thread.h
r249 r403 165 165 RTTHREADTYPE_TIMER, 166 166 /** Only used for validation. */ 167 RTTHREADTYPE_ LAST167 RTTHREADTYPE_END 168 168 } RTTHREADTYPE; 169 169 … … 234 234 RTDECL(int) RTThreadSetType(RTTHREAD Thread, RTTHREADTYPE enmType); 235 235 236 #ifdef IN_RING3 236 /** 237 * Wait for the thread to terminate, resume on interruption. 238 * 239 * @returns iprt status code. 240 * Will not return VERR_INTERRUPTED. 241 * @param Thread The thread to wait for. 242 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for 243 * an indefinite wait. 244 * @param prc Where to store the return code of the thread. Optional. 245 */ 246 RTDECL(int) RTThreadWait(RTTHREAD Thread, unsigned cMillies, int *prc); 247 248 /** 249 * Wait for the thread to terminate, return on interruption. 250 * 251 * @returns iprt status code. 252 * @param Thread The thread to wait for. 253 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for 254 * an indefinite wait. 255 * @param prc Where to store the return code of the thread. Optional. 256 */ 257 RTDECL(int) RTThreadWaitNoResume(RTTHREAD Thread, unsigned cMillies, int *prc); 258 259 /** 260 * Gets the name of the current thread thread. 261 * 262 * @returns Pointer to readonly name string. 263 * @returns NULL on failure. 264 */ 265 RTDECL(const char *) RTThreadSelfName(void); 266 267 /** 268 * Gets the name of a thread. 269 * 270 * @returns Pointer to readonly name string. 271 * @returns NULL on failure. 272 * @param Thread Thread handle of the thread to query the name of. 273 */ 274 RTDECL(const char *) RTThreadGetName(RTTHREAD Thread); 275 237 276 /** 238 277 * Gets the type of the specified thread. … … 242 281 * @param Thread The thread in question. 243 282 */ 244 RTR3DECL(RTTHREADTYPE) RTThreadGetType(RTTHREAD Thread); 283 RTDECL(RTTHREADTYPE) RTThreadGetType(RTTHREAD Thread); 284 285 /** 286 * Sets the name of a thread. 287 * 288 * @returns iprt status code. 289 * @param Thread Thread handle of the thread to query the name of. 290 * @param pszName The thread name. 291 */ 292 RTDECL(int) RTThreadSetName(RTTHREAD Thread, const char *pszName); 293 294 /** 295 * Signal the user event. 296 * 297 * @returns iprt status code. 298 */ 299 RTDECL(int) RTThreadUserSignal(RTTHREAD Thread); 300 301 /** 302 * Wait for the user event. 303 * 304 * @returns iprt status code. 305 * @param Thread The thread to wait for. 306 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for 307 * an indefinite wait. 308 */ 309 RTDECL(int) RTThreadUserWait(RTTHREAD Thread, unsigned cMillies); 310 311 /** 312 * Wait for the user event, return on interruption. 313 * 314 * @returns iprt status code. 315 * @param Thread The thread to wait for. 316 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for 317 * an indefinite wait. 318 */ 319 RTDECL(int) RTThreadUserWaitNoResume(RTTHREAD Thread, unsigned cMillies); 320 321 /** 322 * Reset the user event. 323 * 324 * @returns iprt status code. 325 * @param Thread The thread to reset. 326 */ 327 RTDECL(int) RTThreadUserReset(RTTHREAD Thread); 328 329 330 #ifdef IN_RING3 245 331 246 332 /** … … 256 342 257 343 /** 258 * Gets the name of the current thread thread.259 *260 * @returns Pointer to readonly name string.261 * @returns NULL on failure.262 */263 RTR3DECL(const char *) RTThreadSelfName(void);264 265 /**266 * Gets the name of a thread.267 *268 * @returns Pointer to readonly name string.269 * @returns NULL on failure.270 * @param Thread Thread handle of the thread to query the name of.271 */272 RTR3DECL(const char *) RTThreadGetName(RTTHREAD Thread);273 274 /**275 * Sets the name of a thread.276 *277 * @returns iprt status code.278 * @param Thread Thread handle of the thread to query the name of.279 * @param pszName The thread name.280 */281 RTR3DECL(int) RTThreadSetName(RTTHREAD Thread, const char *pszName);282 283 /**284 * Signal the user event.285 *286 * @returns iprt status code.287 */288 RTR3DECL(int) RTThreadUserSignal(RTTHREAD Thread);289 290 /**291 * Wait for the user event.292 *293 * @returns iprt status code.294 * @param Thread The thread to wait for.295 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for296 * an indefinite wait.297 */298 RTR3DECL(int) RTThreadUserWait(RTTHREAD Thread, unsigned cMillies);299 300 /**301 * Wait for the user event, return on interruption.302 *303 * @returns iprt status code.304 * @param Thread The thread to wait for.305 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for306 * an indefinite wait.307 */308 RTR3DECL(int) RTThreadUserWaitNoResume(RTTHREAD Thread, unsigned cMillies);309 310 /**311 * Reset the user event.312 *313 * @returns iprt status code.314 * @param Thread The thread to reset.315 */316 RTR3DECL(int) RTThreadUserReset(RTTHREAD Thread);317 318 /**319 * Wait for the thread to terminate, resume on interruption.320 *321 * @returns iprt status code.322 * Will not return VERR_INTERRUPTED.323 * @param Thread The thread to wait for.324 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for325 * an indefinite wait.326 * @param prc Where to store the return code of the thread. Optional.327 */328 RTR3DECL(int) RTThreadWait(RTTHREAD Thread, unsigned cMillies, int *prc);329 330 /**331 * Wait for the thread to terminate, return on interruption.332 *333 * @returns iprt status code.334 * @param Thread The thread to wait for.335 * @param cMillies The number of milliseconds to wait. Use RT_INDEFINITE_WAIT for336 * an indefinite wait.337 * @param prc Where to store the return code of the thread. Optional.338 */339 RTR3DECL(int) RTThreadWaitNoResume(RTTHREAD Thread, unsigned cMillies, int *prc);340 341 /**342 344 * Gets the affinity mask of the current thread. 343 345 * -
trunk/src/VBox/HostDrivers/Support/SUPDRVShared.c
r397 r403 113 113 { "RTSpinlockAcquireNoInts", (void *)RTSpinlockAcquireNoInts }, 114 114 { "RTSpinlockReleaseNoInts", (void *)RTSpinlockReleaseNoInts }, 115 { "RTThread Self", (void *)RTThreadSelf },115 { "RTThreadNativeSelf", (void *)RTThreadNativeSelf }, 116 116 { "RTThreadSleep", (void *)RTThreadSleep }, 117 117 { "RTThreadYield", (void *)RTThreadYield }, 118 #if 0 /* Thread APIs, Part 2. */ 119 { "RTThreadSelf", (void *)RTThreadSelf }, 120 { "RTThreadCreate", (void *)RTThreadCreate }, 121 { "RTThreadGetNative", (void *)RTThreadGetNative }, 122 { "RTThreadWait", (void *)RTThreadWait }, 123 { "RTThreadWaitNoResume", (void *)RTThreadWaitNoResume }, 124 { "RTThreadGetName", (void *)RTThreadGetName }, 125 { "RTThreadSelfName", (void *)RTThreadSelfName }, 126 { "RTThreadGetType", (void *)RTThreadGetType }, 127 { "RTThreadUserSignal", (void *)RTThreadUserSignal }, 128 { "RTThreadUserReset", (void *)RTThreadUserReset }, 129 { "RTThreadUserWait", (void *)RTThreadUserWait }, 130 { "RTThreadUserWaitNoResume", (void *)RTThreadUserWaitNoResume }, 131 #endif 118 132 { "RTLogDefaultInstance", (void *)RTLogDefaultInstance }, 119 133 { "RTLogRelDefaultInstance", (void *)RTLogRelDefaultInstance }, -
trunk/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
r397 r403 284 284 285 285 memset(&g_DevExt, 0, sizeof(g_DevExt)); 286 dprintf(("VBoxSupDrvStop - done\n")); 286 287 return KMOD_RETURN_SUCCESS; 287 288 } -
trunk/src/VBox/Runtime/Makefile
r391 r403 532 532 strformatrt.cpp \ 533 533 strtonum.cpp \ 534 strprintf.cpp \ 534 535 VBox/strformat-vbox.cpp \ 535 536 r0drv/alloc-r0drv.cpp \ … … 539 540 generic/RTLogWriteUser-generic.cpp \ 540 541 VBox/log-vbox.cpp \ 542 table/avlpv.cpp \ 541 543 crc32.cpp \ 542 544 crc64.cpp … … 570 572 string/memchr.asm \ 571 573 r0drv/memobj-r0drv.cpp \ 572 r0drv/thread-r0drv.cpp \573 574 r0drv/darwin/alloc-r0drv-darwin.cpp \ 574 575 r0drv/darwin/memobj-r0drv-darwin.cpp \ … … 579 580 r0drv/darwin/spinlock-r0drv-darwin.cpp \ 580 581 r0drv/darwin/thread-r0drv-darwin.cpp \ 582 r0drv/darwin/thread2-r0drv-darwin.cpp \ 581 583 r0drv/darwin/time-r0drv-darwin.cpp \ 584 thread.cpp \ 582 585 generic/timer-generic.cpp \ 583 586 -
trunk/src/VBox/Runtime/generic/sched-generic.cpp
r1 r403 41 41 int rtSchedNativeCalcDefaultPriority(RTTHREADTYPE enmType) 42 42 { 43 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);43 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 44 44 return VINF_SUCCESS; 45 45 } … … 76 76 int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType) 77 77 { 78 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);78 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 79 79 return VINF_SUCCESS; 80 80 } -
trunk/src/VBox/Runtime/generic/semsrw-generic.cpp
r1 r403 101 101 102 102 103 RT R3DECL(int) RTSemRWCreate(PRTSEMRW pRWSem)103 RTDECL(int) RTSemRWCreate(PRTSEMRW pRWSem) 104 104 { 105 105 int rc; … … 160 160 161 161 162 RT R3DECL(int) RTSemRWDestroy(RTSEMRW RWSem)162 RTDECL(int) RTSemRWDestroy(RTSEMRW RWSem) 163 163 { 164 164 /* … … 235 235 236 236 237 RT R3DECL(int) RTSemRWRequestRead(RTSEMRW RWSem, unsigned cMillies)237 RTDECL(int) RTSemRWRequestRead(RTSEMRW RWSem, unsigned cMillies) 238 238 { 239 239 /* … … 366 366 367 367 368 RT R3DECL(int) RTSemRWRequestReadNoResume(RTSEMRW RWSem, unsigned cMillies)368 RTDECL(int) RTSemRWRequestReadNoResume(RTSEMRW RWSem, unsigned cMillies) 369 369 { 370 370 return RTSemRWRequestRead(RWSem, cMillies); … … 372 372 373 373 374 RT R3DECL(int) RTSemRWReleaseRead(RTSEMRW RWSem)374 RTDECL(int) RTSemRWReleaseRead(RTSEMRW RWSem) 375 375 { 376 376 /* … … 438 438 439 439 440 RT R3DECL(int) RTSemRWRequestWrite(RTSEMRW RWSem, unsigned cMillies)440 RTDECL(int) RTSemRWRequestWrite(RTSEMRW RWSem, unsigned cMillies) 441 441 { 442 442 /* … … 582 582 583 583 584 RT R3DECL(int) RTSemRWRequestWriteNoResume(RTSEMRW RWSem, unsigned cMillies)584 RTDECL(int) RTSemRWRequestWriteNoResume(RTSEMRW RWSem, unsigned cMillies) 585 585 { 586 586 return RTSemRWRequestWrite(RWSem, cMillies); … … 589 589 590 590 591 RT R3DECL(int) RTSemRWReleaseWrite(RTSEMRW RWSem)591 RTDECL(int) RTSemRWReleaseWrite(RTSEMRW RWSem) 592 592 { 593 593 /* -
trunk/src/VBox/Runtime/generic/timer-generic.cpp
r198 r403 32 32 #include <iprt/time.h> 33 33 #include <iprt/log.h> 34 34 35 35 36 … … 153 154 * If it's suspended we can safely set the destroy flag and signal it. 154 155 */ 155 #ifdef IN_RING3156 156 RTTHREAD Thread = pTimer->Thread; 157 #endif158 157 if (!pTimer->fSuspended) 159 158 { … … 170 169 } 171 170 172 #ifdef IN_RING3173 171 RTThreadWait(Thread, 250, NULL); 174 #endif175 172 return VINF_SUCCESS; 176 173 } … … 189 186 u64First += RTTimeNanoTS(); 190 187 ASMAtomicXchgU64(&pTimer->iTick, 0); 191 ASMAtomicXchgU64(&pTimer->iTick, u64First);192 188 ASMAtomicXchgU64(&pTimer->u64StartTS, u64First); 189 ASMAtomicXchgU64(&pTimer->u64NextTS, u64First); 193 190 ASMAtomicXchgU8(&pTimer->fSuspended, false); 194 191 int rc = RTSemEventSignal(pTimer->Event); … … 216 213 AssertRC(rc); 217 214 return rc; 218 219 215 } 220 216 -
trunk/src/VBox/Runtime/include/internal/thread.h
r197 r403 25 25 #include <iprt/types.h> 26 26 #include <iprt/thread.h> 27 #include <iprt/avl.h> 27 28 #ifdef IN_RING3 28 29 # include <iprt/process.h> 29 30 # include <iprt/critsect.h> 30 # include <iprt/avl.h>31 31 #endif 32 32 33 33 __BEGIN_DECLS 34 34 35 36 #ifdef IN_RING337 35 38 36 … … 89 87 /** The current thread state. */ 90 88 RTTHREADSTATE volatile enmState; 91 #if def __WIN__89 #if defined(__WIN__) && defined(IN_RING3) 92 90 /** The thread handle. 93 91 * This is not valid until the create function has returned! */ … … 112 110 /** Actual stack size. */ 113 111 size_t cbStack; 112 #ifdef IN_RING3 114 113 /** What we're blocking on. */ 115 114 union RTTHREADINTBLOCKID … … 127 126 /** Where we're blocking. */ 128 127 RTUINTPTR volatile uBlockId; 128 #endif /* IN_RING3 */ 129 129 /** Thread name. */ 130 130 char szName[RTTHREAD_NAME_LEN]; … … 154 154 * Initialize the native part of the thread management. 155 155 * 156 * Generally a TLS entry will be allocated at this point .156 * Generally a TLS entry will be allocated at this point (Ring-3). 157 157 * 158 158 * @returns iprt status code. 159 159 */ 160 160 int rtThreadNativeInit(void); 161 162 /** 163 * Create a native thread. 164 * This creates the thread as described in pThreadInt and stores the thread id in *pThread. 165 * 166 * @returns iprt status code. 167 * @param pThreadInt The thread data structure for the thread. 168 * @param pNativeThread Where to store the native thread identifier. 169 */ 170 int rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread); 171 172 /** 173 * Adopts a thread, this is called immediately after allocating the 174 * thread structure. 175 * 176 * @param pThread Pointer to the thread structure. 177 */ 178 int rtThreadNativeAdopt(PRTTHREADINT pThread); 161 179 162 180 /** … … 174 192 int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType); 175 193 176 /** 177 * Create a native thread. 178 * This creates the thread as described in pThreadInt and stores the thread id in *pThread. 179 * 180 * @returns iprt status code. 181 * @param pThreadInt The thread data structure for the thread. 182 * @param pNativeThread Where to store the native thread identifier. 183 */ 184 int rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread); 185 186 /** 187 * Adopts a thread, this is called immediately after allocating the 188 * thread structure. 189 * 190 * @param pThread Pointer to the thread structure. 191 */ 192 int rtThreadNativeAdopt(PRTTHREADINT pThread); 193 194 #ifdef __WIN__ 194 #ifdef IN_RING3 195 # ifdef __WIN__ 195 196 /** 196 197 * Callback for when a native thread is detaching. … … 200 201 */ 201 202 void rtThreadNativeDetach(void); 202 #endif 203 204 int rtThreadInit(void); 203 # endif 204 #endif /* !IN_RING0 */ 205 206 207 /* thread.cpp */ 205 208 int rtThreadMain(PRTTHREADINT pThread, RTNATIVETHREAD NativeThread); 206 void rtThreadInsert(PRTTHREADINT pThread, RTNATIVETHREAD NativeThread);207 PRTTHREADINT rtThreadGetByNative(RTNATIVETHREAD NativeThread);208 PRTTHREADINT rtThreadGet(RTTHREAD Thread);209 uint32_t rtThreadRelease(PRTTHREADINT pThread);210 int rtThreadDoSetProcPriority(RTPROCPRIORITY enmPriority);211 void rtThreadTerminate(PRTTHREADINT pThread, int rc);212 209 void rtThreadBlocking(PRTTHREADINT pThread, RTTHREADSTATE enmState, uint64_t u64Block, 213 210 const char *pszFile, unsigned uLine, RTUINTPTR uId); 214 211 void rtThreadUnblocked(PRTTHREADINT pThread, RTTHREADSTATE enmCurState); 215 216 217 #elif defined(IN_RING0) 218 219 /** 220 * Argument package for a ring-0 thread. 221 */ 222 typedef struct RTR0THREADARGS 223 { 224 /** The thread function. */ 225 PFNRTTHREAD pfnThread; 226 /** The thread function argument. */ 227 void *pvUser; 228 /** The thread type. */ 229 RTTHREADTYPE enmType; 230 } RTR0THREADARGS, *PRTR0THREADARGS; 231 232 233 234 int rtThreadMain(PRTR0THREADARGS pArgs, RTNATIVETHREAD NativeThread); 235 236 /** 237 * Do the actual thread creation. 238 * 239 * @returns IPRT status code. 240 * On failure, no thread has been created. 241 * @param pArgs The argument package. 242 * @param pNativeThread Where to return the native thread handle. 243 */ 244 int rtThreadNativeCreate(PRTR0THREADARGS pArgs, PRTNATIVETHREAD pNativeThread); 245 246 /** 247 * Do the actual thread priority change. 248 * 249 * @returns IPRT status code. 250 * @param Thread The thread which priority should be changed. 251 * This is currently restricted to the current thread. 252 * @param enmType The new thread priority type (valid). 253 */ 254 int rtThreadNativeSetPriority(RTTHREAD Thread, RTTHREADTYPE enmType); 255 212 uint32_t rtThreadRelease(PRTTHREADINT pThread); 213 void rtThreadTerminate(PRTTHREADINT pThread, int rc); 214 PRTTHREADINT rtThreadGetByNative(RTNATIVETHREAD NativeThread); 215 PRTTHREADINT rtThreadGet(RTTHREAD Thread); 216 int rtThreadInit(void); 217 void rtThreadTerm(void); 218 void rtThreadInsert(PRTTHREADINT pThread, RTNATIVETHREAD NativeThread); 219 #ifdef IN_RING3 220 int rtThreadDoSetProcPriority(RTPROCPRIORITY enmPriority); 256 221 #endif /* !IN_RING0 */ 257 222 -
trunk/src/VBox/Runtime/r0drv/darwin/semaphore-r0drv-darwin.cpp
r205 r403 56 56 #define RTSEMEVENT_MAGIC 0x19601110 57 57 58 59 /** 60 * Darwin multiple release event semaphore. 61 */ 62 typedef struct RTSEMEVENTMULTIINTERNAL 63 { 64 /** Magic value (RTSEMEVENTMULTI_MAGIC). */ 65 uint32_t volatile u32Magic; 66 /** The number of waiting threads. */ 67 uint32_t volatile cWaiters; 68 /** Set if the event object is signaled. */ 69 uint8_t volatile fSignaled; 70 /** The number of threads in the process of waking up. */ 71 uint32_t volatile cWaking; 72 /** The spinlock protecting us. */ 73 lck_spin_t *pSpinlock; 74 } RTSEMEVENTMULTIINTERNAL, *PRTSEMEVENTMULTIINTERNAL; 75 76 /** Magic for the Darwin multiple release event semaphore structure. (Isaac Asimov) */ 77 #define RTSEMEVENTMULTI_MAGIC 0x19200102 78 79 58 80 #if 0 /** @todo */ 59 81 /** … … 187 209 Assert(!pEventInt->cWaiters); 188 210 ASMAtomicXchgU8(&pEventInt->fSignaled, false); 189 rc = 0;211 rc = VINF_SUCCESS; 190 212 } 191 213 else … … 270 292 return rtSemEventWait(EventSem, cMillies, TRUE /* interruptable */); 271 293 } 294 295 296 297 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 298 { 299 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 300 AssertPtrReturn(pEventMultiSem, VERR_INVALID_POINTER); 301 302 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pEventMultiInt)); 303 if (pEventMultiInt) 304 { 305 pEventMultiInt->u32Magic = RTSEMEVENTMULTI_MAGIC; 306 pEventMultiInt->cWaiters = 0; 307 pEventMultiInt->cWaking = 0; 308 pEventMultiInt->fSignaled = 0; 309 Assert(g_pDarwinLockGroup); 310 pEventMultiInt->pSpinlock = lck_spin_alloc_init(g_pDarwinLockGroup, LCK_ATTR_NULL); 311 if (pEventMultiInt->pSpinlock) 312 { 313 *pEventMultiSem = pEventMultiInt; 314 return VINF_SUCCESS; 315 } 316 317 pEventMultiInt->u32Magic = 0; 318 RTMemFree(pEventMultiInt); 319 } 320 return VERR_NO_MEMORY; 321 } 322 323 324 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem) 325 { 326 if (EventMultiSem == NIL_RTSEMEVENTMULTI) /* don't bitch */ 327 return VERR_INVALID_HANDLE; 328 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 329 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 330 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 331 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 332 VERR_INVALID_HANDLE); 333 334 lck_spin_lock(pEventMultiInt->pSpinlock); 335 ASMAtomicIncU32(&pEventMultiInt->u32Magic); /* make the handle invalid */ 336 if (pEventMultiInt->cWaiters > 0) 337 { 338 /* abort waiting thread, last man cleans up. */ 339 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 340 thread_wakeup_prim((event_t)pEventMultiInt, FALSE /* all threads */, THREAD_RESTART); 341 lck_spin_unlock(pEventMultiInt->pSpinlock); 342 } 343 else if (pEventMultiInt->cWaking) 344 /* the last waking thread is gonna do the cleanup */ 345 lck_spin_unlock(pEventMultiInt->pSpinlock); 346 else 347 { 348 lck_spin_unlock(pEventMultiInt->pSpinlock); 349 lck_spin_destroy(pEventMultiInt->pSpinlock, g_pDarwinLockGroup); 350 RTMemFree(pEventMultiInt); 351 } 352 353 return VINF_SUCCESS; 354 } 355 356 357 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem) 358 { 359 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 360 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 361 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 362 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 363 VERR_INVALID_HANDLE); 364 365 lck_spin_lock(pEventMultiInt->pSpinlock); 366 367 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, true); 368 if (pEventMultiInt->cWaiters > 0) 369 { 370 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 371 ASMAtomicXchgU32(&pEventMultiInt->cWaiters, 0); 372 thread_wakeup_prim((event_t)pEventMultiInt, FALSE /* all threads */, THREAD_AWAKENED); 373 } 374 375 lck_spin_unlock(pEventMultiInt->pSpinlock); 376 return VINF_SUCCESS; 377 } 378 379 380 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem) 381 { 382 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 383 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 384 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 385 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 386 VERR_INVALID_HANDLE); 387 388 lck_spin_lock(pEventMultiInt->pSpinlock); 389 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, false); 390 lck_spin_unlock(pEventMultiInt->pSpinlock); 391 return VINF_SUCCESS; 392 } 393 394 395 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, wait_interrupt_t fInterruptible) 396 { 397 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 398 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 399 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 400 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 401 VERR_INVALID_HANDLE); 402 403 lck_spin_lock(pEventMultiInt->pSpinlock); 404 405 int rc; 406 if (pEventMultiInt->fSignaled) 407 { 408 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, false); 409 rc = VINF_SUCCESS; 410 } 411 else 412 { 413 ASMAtomicIncU32(&pEventMultiInt->cWaiters); 414 415 wait_result_t rcWait; 416 if (cMillies == RT_INDEFINITE_WAIT) 417 rcWait = lck_spin_sleep(pEventMultiInt->pSpinlock, LCK_SLEEP_DEFAULT, (event_t)pEventMultiInt, fInterruptible); 418 else 419 { 420 uint64_t u64AbsTime; 421 nanoseconds_to_absolutetime(cMillies * UINT64_C(1000000), &u64AbsTime); 422 u64AbsTime += mach_absolute_time(); 423 424 rcWait = lck_spin_sleep_deadline(pEventMultiInt->pSpinlock, LCK_SLEEP_DEFAULT, 425 (event_t)pEventMultiInt, fInterruptible, u64AbsTime); 426 } 427 switch (rcWait) 428 { 429 case THREAD_AWAKENED: 430 Assert(pEventMultiInt->cWaking > 0); 431 if ( !ASMAtomicDecU32(&pEventMultiInt->cWaking) 432 && pEventMultiInt->u32Magic != RTSEMEVENTMULTI_MAGIC) 433 { 434 /* the event was destroyed after we woke up, as the last thread do the cleanup. */ 435 lck_spin_unlock(pEventMultiInt->pSpinlock); 436 Assert(g_pDarwinLockGroup); 437 lck_spin_destroy(pEventMultiInt->pSpinlock, g_pDarwinLockGroup); 438 RTMemFree(pEventMultiInt); 439 return VINF_SUCCESS; 440 } 441 rc = VINF_SUCCESS; 442 break; 443 444 case THREAD_TIMED_OUT: 445 Assert(cMillies != RT_INDEFINITE_WAIT); 446 ASMAtomicDecU32(&pEventMultiInt->cWaiters); 447 rc = VERR_TIMEOUT; 448 break; 449 450 case THREAD_INTERRUPTED: 451 Assert(fInterruptible); 452 ASMAtomicDecU32(&pEventMultiInt->cWaiters); 453 rc = VERR_INTERRUPTED; 454 break; 455 456 case THREAD_RESTART: 457 /* Last one out does the cleanup. */ 458 if (!ASMAtomicDecU32(&pEventMultiInt->cWaking)) 459 { 460 lck_spin_unlock(pEventMultiInt->pSpinlock); 461 Assert(g_pDarwinLockGroup); 462 lck_spin_destroy(pEventMultiInt->pSpinlock, g_pDarwinLockGroup); 463 RTMemFree(pEventMultiInt); 464 return VERR_SEM_DESTROYED; 465 } 466 467 rc = VERR_SEM_DESTROYED; 468 break; 469 470 default: 471 AssertMsgFailed(("rcWait=%d\n", rcWait)); 472 rc = VERR_GENERAL_FAILURE; 473 break; 474 } 475 } 476 477 lck_spin_unlock(pEventMultiInt->pSpinlock); 478 return rc; 479 } 480 481 482 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies) 483 { 484 return rtSemEventMultiWait(EventMultiSem, cMillies, FALSE /* not interruptable */); 485 } 486 487 488 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies) 489 { 490 return rtSemEventMultiWait(EventMultiSem, cMillies, TRUE /* interruptable */); 491 } 492 272 493 273 494 -
trunk/src/VBox/Runtime/r0drv/darwin/thread-r0drv-darwin.cpp
r197 r403 26 26 #include <iprt/thread.h> 27 27 #include <iprt/err.h> 28 #include <iprt/assert.h>29 #include "internal/thread.h"30 28 31 29 32 RTDECL(RTTHREAD) RTThreadSelf(void) 30 31 RTDECL(RTNATIVETHREAD) RTThreadNativeSelf(void) 33 32 { 34 return (RT THREAD)current_thread();33 return (RTNATIVETHREAD)current_thread(); 35 34 } 36 35 37 36 38 RTDECL(int) 37 RTDECL(int) RTThreadSleep(unsigned cMillies) 39 38 { 40 39 uint64_t u64Deadline; … … 51 50 } 52 51 53 54 int rtThreadNativeSetPriority(RTTHREAD Thread, RTTHREADTYPE enmType)55 {56 /*57 * Convert the priority type to scheduling policies.58 */59 bool fSetExtended = false;60 thread_extended_policy Extended = { true };61 bool fSetTimeContstraint = false;62 thread_time_constraint_policy TimeConstraint = { 0, 0, 0, true };63 thread_precedence_policy Precedence = { 0 };64 switch (enmType)65 {66 case RTTHREADTYPE_INFREQUENT_POLLER:67 Precedence.importance = 1;68 break;69 70 case RTTHREADTYPE_EMULATION:71 Precedence.importance = 30;72 break;73 74 case RTTHREADTYPE_DEFAULT:75 Precedence.importance = 31;76 break;77 78 case RTTHREADTYPE_MSG_PUMP:79 Precedence.importance = 34;80 break;81 82 case RTTHREADTYPE_IO:83 Precedence.importance = 98;84 break;85 86 case RTTHREADTYPE_TIMER:87 Precedence.importance = 0x7fffffff;88 89 fSetExtended = true;90 Extended.timeshare = FALSE;91 92 fSetTimeContstraint = true;93 TimeConstraint.period = 0; /* not really true for a real timer thread, but we've really no idea. */94 TimeConstraint.computation = rtDarwinAbsTimeFromNano(100000); /* 100 us*/95 TimeConstraint.constraint = rtDarwinAbsTimeFromNano(500000); /* 500 us */96 TimeConstraint.preemptible = FALSE;97 break;98 99 default:100 AssertMsgFailed(("enmType=%d\n", enmType));101 return VERR_INVALID_PARAMETER;102 }103 104 /*105 * Do the actual modification.106 */107 kern_return_t rc = thread_policy_set((thread_t)Thread, THREAD_PRECEDENCE_POLICY,108 (thread_policy_t)&Precedence, THREAD_PRECEDENCE_POLICY_COUNT);109 AssertMsg(rc == KERN_SUCCESS, ("%rc\n", rc)); NOREF(rc);110 111 if (fSetExtended)112 {113 rc = thread_policy_set((thread_t)Thread, THREAD_EXTENDED_POLICY,114 (thread_policy_t)&Extended, THREAD_EXTENDED_POLICY_COUNT);115 AssertMsg(rc == KERN_SUCCESS, ("%rc\n", rc));116 }117 118 if (fSetTimeContstraint)119 {120 rc = thread_policy_set((thread_t)Thread, THREAD_TIME_CONSTRAINT_POLICY,121 (thread_policy_t)&TimeConstraint, THREAD_TIME_CONSTRAINT_POLICY_COUNT);122 AssertMsg(rc == KERN_SUCCESS, ("%rc\n", rc));123 }124 125 return VINF_SUCCESS; /* ignore any errors for now */126 }127 128 129 /**130 * Native kernel thread wrapper function.131 *132 * This will forward to rtThreadMain and do termination upon return.133 *134 * @param pvArg Pointer to the argument package.135 * @param Ignored Wait result, which we ignore.136 */137 static void rtThreadNativeMain(void *pvArg, wait_result_t Ignored)138 {139 const thread_t Self = current_thread();140 141 rtThreadMain((PRTR0THREADARGS)pvArg, (RTNATIVETHREAD)Self);142 143 kern_return_t rc = thread_terminate(Self);144 AssertFatalMsgFailed(("rc=%d\n", rc));145 }146 147 148 int rtThreadNativeCreate(PRTR0THREADARGS pArgs, PRTNATIVETHREAD pNativeThread)149 {150 thread_t NativeThread;151 kern_return_t rc = kernel_thread_start(rtThreadNativeMain, pArgs, &NativeThread);152 if (rc == KERN_SUCCESS)153 {154 *pNativeThread = (RTNATIVETHREAD)NativeThread;155 thread_deallocate(NativeThread);156 return VINF_SUCCESS;157 }158 return RTErrConvertFromMachKernReturn(rc);159 }160 -
trunk/src/VBox/Runtime/r0drv/darwin/thread2-r0drv-darwin.cpp
r375 r403 1 1 /* $Id$ */ 2 2 /** @file 3 * InnoTek Portable Runtime - Threads , Ring-0 Driver, Darwin.3 * InnoTek Portable Runtime - Threads (Part 2), Ring-0 Driver, Darwin. 4 4 */ 5 5 … … 30 30 31 31 32 RTDECL(RTTHREAD) RTThreadSelf(void)32 int rtThreadNativeInit(void) 33 33 { 34 return (RTTHREAD)current_thread(); 35 } 36 37 38 RTDECL(int) RTThreadSleep(unsigned cMillies) 39 { 40 uint64_t u64Deadline; 41 clock_interval_to_deadline(cMillies, kMillisecondScale, &u64Deadline); 42 clock_delay_until(u64Deadline); 34 /* No TLS in Ring-0. :-/ */ 43 35 return VINF_SUCCESS; 44 36 } 45 37 46 38 47 RTDECL( bool) RTThreadYield(void)39 RTDECL(RTTHREAD) RTThreadSelf(void) 48 40 { 49 thread_block(THREAD_CONTINUE_NULL); 50 return true; /* this is fishy */ 41 return rtThreadGetByNative((RTNATIVETHREAD)current_thread()); 51 42 } 52 43 53 44 54 int rtThreadNativeSetPriority( RTTHREADThread, RTTHREADTYPE enmType)45 int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType) 55 46 { 56 47 /* 57 48 * Convert the priority type to scheduling policies. 49 * (This is really just guess work.) 58 50 */ 59 51 bool fSetExtended = false; … … 105 97 * Do the actual modification. 106 98 */ 107 kern_return_t rc = thread_policy_set((thread_t)Thread, THREAD_PRECEDENCE_POLICY,99 kern_return_t kr = thread_policy_set((thread_t)pThread->Core.Key, THREAD_PRECEDENCE_POLICY, 108 100 (thread_policy_t)&Precedence, THREAD_PRECEDENCE_POLICY_COUNT); 109 AssertMsg( rc == KERN_SUCCESS, ("%rc\n", rc)); NOREF(rc);101 AssertMsg(kr == KERN_SUCCESS, ("%rc\n", kr)); NOREF(kr); 110 102 111 103 if (fSetExtended) 112 104 { 113 rc = thread_policy_set((thread_t)Thread, THREAD_EXTENDED_POLICY,105 kr = thread_policy_set((thread_t)pThread->Core.Key, THREAD_EXTENDED_POLICY, 114 106 (thread_policy_t)&Extended, THREAD_EXTENDED_POLICY_COUNT); 115 AssertMsg( rc == KERN_SUCCESS, ("%rc\n", rc));107 AssertMsg(kr == KERN_SUCCESS, ("%rc\n", kr)); 116 108 } 117 109 118 110 if (fSetTimeContstraint) 119 111 { 120 rc = thread_policy_set((thread_t)Thread, THREAD_TIME_CONSTRAINT_POLICY,112 kr = thread_policy_set((thread_t)pThread->Core.Key, THREAD_TIME_CONSTRAINT_POLICY, 121 113 (thread_policy_t)&TimeConstraint, THREAD_TIME_CONSTRAINT_POLICY_COUNT); 122 AssertMsg( rc == KERN_SUCCESS, ("%rc\n", rc));114 AssertMsg(kr == KERN_SUCCESS, ("%rc\n", kr)); 123 115 } 124 116 125 117 return VINF_SUCCESS; /* ignore any errors for now */ 118 } 119 120 121 int rtThreadNativeAdopt(PRTTHREADINT pThread) 122 { 123 return VERR_NOT_IMPLEMENTED; 126 124 } 127 125 … … 139 137 const thread_t Self = current_thread(); 140 138 141 rtThreadMain((PRT R0THREADARGS)pvArg, (RTNATIVETHREAD)Self);139 rtThreadMain((PRTTHREADINT)pvArg, (RTNATIVETHREAD)Self); 142 140 143 kern_return_t rc= thread_terminate(Self);144 AssertFatalMsgFailed((" rc=%d\n", rc));141 kern_return_t kr = thread_terminate(Self); 142 AssertFatalMsgFailed(("kr=%d\n", kr)); 145 143 } 146 144 147 145 148 int rtThreadNativeCreate(PRT R0THREADARGS pArgs, PRTNATIVETHREAD pNativeThread)146 int rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread) 149 147 { 150 148 thread_t NativeThread; 151 kern_return_t rc = kernel_thread_start(rtThreadNativeMain, pArgs, &NativeThread);152 if ( rc== KERN_SUCCESS)149 kern_return_t kr = kernel_thread_start(rtThreadNativeMain, pThreadInt, &NativeThread); 150 if (kr == KERN_SUCCESS) 153 151 { 154 152 *pNativeThread = (RTNATIVETHREAD)NativeThread; … … 156 154 return VINF_SUCCESS; 157 155 } 158 return RTErrConvertFromMachKernReturn( rc);156 return RTErrConvertFromMachKernReturn(kr); 159 157 } 160 158 -
trunk/src/VBox/Runtime/r0drv/initterm-r0drv.cpp
r207 r403 26 26 #include <iprt/initterm.h> 27 27 #include <iprt/assert.h> 28 #include <iprt/err.h> 29 28 30 #include "internal/initterm.h" 31 #include "internal/thread.h" 29 32 30 33 … … 37 40 RTR0DECL(int) RTR0Init(unsigned fReserved) 38 41 { 42 int rc; 39 43 Assert(fReserved == 0); 40 return rtR0InitNative(); 44 rc = rtR0InitNative(); 45 if (RT_SUCCESS(rc)) 46 { 47 #if !defined(__LINUX__) && !defined(__WIN__) 48 rc = rtThreadInit(); 49 #endif 50 if (RT_SUCCESS(rc)) 51 return rc; 52 53 rtR0TermNative(); 54 } 55 return rc; 41 56 } 42 57 … … 47 62 RTR0DECL(void) RTR0Term(void) 48 63 { 49 return rtR0TermNative(); 64 #if !defined(__LINUX__) && !defined(__WIN__) 65 rtThreadTerm(); 66 #endif 67 rtR0TermNative(); 50 68 } 51 69 -
trunk/src/VBox/Runtime/r0drv/linux/thread-r0drv-linux.c
r1 r403 29 29 30 30 31 RTDECL(RT THREAD) RTThreadSelf(void)31 RTDECL(RTNATIVETHREAD) RTThreadNativeSelf(void) 32 32 { 33 return (RT THREAD)current;33 return (RTNATIVETHREAD)current; 34 34 } 35 35 -
trunk/src/VBox/Runtime/r0drv/linux/thread2-r0drv-linux.c
r375 r403 1 1 /* $Id$ */ 2 2 /** @file 3 * InnoTek Portable Runtime - Threads , Ring-0 Driver, Linux.3 * InnoTek Portable Runtime - Threads (Part 2), Ring-0 Driver, Linux. 4 4 */ 5 5 … … 27 27 #include <iprt/thread.h> 28 28 #include <iprt/err.h> 29 #include "internal/thread.h" 29 30 30 31 31 32 RTDECL(RTTHREAD) RTThreadSelf(void) 32 33 { 33 return (RTTHREAD)current;34 return rtThreadGetByNative(((RTNATIVETHREAD)current); 34 35 } 35 36 36 37 RTDECL(int) RTThreadSleep(unsigned cMillies)38 {39 long cJiffies = msecs_to_jiffies(cMillies);40 set_current_state(TASK_INTERRUPTIBLE);41 cJiffies = schedule_timeout(cJiffies);42 if (!cJiffies)43 return VINF_SUCCESS;44 return VERR_INTERRUPTED;45 }46 47 48 RTDECL(bool) RTThreadYield(void)49 {50 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 20)51 yield();52 #else53 set_current_state(TASK_RUNNING);54 sys_sched_yield();55 schedule();56 #endif57 return true;58 }59 -
trunk/src/VBox/Runtime/r0drv/nt/thread-r0drv-nt.cpp
r1 r403 33 33 34 34 35 RTDECL(RT THREAD) RTThreadSelf(void)35 RTDECL(RTNATIVETHREAD) RTThreadNativeSelf(void) 36 36 { 37 return (RT THREAD)PsGetCurrentThread();37 return (RTNATIVETHREAD)PsGetCurrentThread(); 38 38 } 39 39 … … 62 62 } 63 63 64 -
trunk/src/VBox/Runtime/r0drv/nt/thread2-r0drv-nt.cpp
r375 r403 1 1 /* $Id$ */ 2 2 /** @file 3 * InnoTek Portable Runtime - Threads , Ring-0 Driver, NT.3 * InnoTek Portable Runtime - Threads (Part 2), Ring-0 Driver, NT. 4 4 */ 5 5 … … 28 28 #include <iprt/err.h> 29 29 30 __BEGIN_DECLS 31 NTSTATUS NTAPI ZwYieldExecution(void); 32 __END_DECLS 30 #include "internal/thread.h" 33 31 34 32 35 33 RTDECL(RTTHREAD) RTThreadSelf(void) 36 34 { 37 return (RTTHREAD)PsGetCurrentThread();35 return rtThreadGetByNative((RTNATIVETHREAD)PsGetCurrentThread()); 38 36 } 39 37 40 41 RTDECL(int) RTThreadSleep(unsigned cMillies)42 {43 LARGE_INTEGER Interval;44 Interval.QuadPart = -(int64_t)cMillies * 10000;45 NTSTATUS rcNt = KeDelayExecutionThread(KernelMode, TRUE, &Interval);46 switch (rcNt)47 {48 case STATUS_SUCCESS:49 return VINF_SUCCESS;50 case STATUS_ALERTED:51 case STATUS_USER_APC:52 return VERR_INTERRUPTED;53 default:54 return RTErrConvertFromNtStatus(rcNt);55 }56 }57 58 59 RTDECL(bool) RTThreadYield(void)60 {61 return ZwYieldExecution() != STATUS_NO_YIELD_PERFORMED;62 }63 -
trunk/src/VBox/Runtime/r3/linux/sched-linux.cpp
r1 r403 124 124 * to only be lowering the priority. 125 125 */ 126 static const PROCPRIORITYTYPE g_aTypesLinuxFree[RTTHREADTYPE_ LAST] =126 static const PROCPRIORITYTYPE g_aTypesLinuxFree[RTTHREADTYPE_END] = 127 127 { 128 128 { RTTHREADTYPE_INVALID, -999999999 }, … … 143 143 * Deltas for a process in which we are restricted and can only lower the priority. 144 144 */ 145 static const PROCPRIORITYTYPE g_aTypesLinuxRestricted[RTTHREADTYPE_ LAST] =145 static const PROCPRIORITYTYPE g_aTypesLinuxRestricted[RTTHREADTYPE_END] = 146 146 { 147 147 { RTTHREADTYPE_INVALID, -999999999 }, … … 165 165 * to the process default of a thread created by a low priority thread. 166 166 */ 167 static const PROCPRIORITYTYPE g_aTypesLinuxFlat[RTTHREADTYPE_ LAST] =167 static const PROCPRIORITYTYPE g_aTypesLinuxFlat[RTTHREADTYPE_END] = 168 168 { 169 169 { RTTHREADTYPE_INVALID, -999999999 }, … … 465 465 int rtSchedNativeCalcDefaultPriority(RTTHREADTYPE enmType) 466 466 { 467 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);467 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 468 468 469 469 /* … … 518 518 */ 519 519 int rc = VINF_SUCCESS; 520 int i = RTTHREADTYPE_ LAST;520 int i = RTTHREADTYPE_END; 521 521 while (--i > RTTHREADTYPE_INVALID) 522 522 { … … 598 598 { 599 599 /* sanity */ 600 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);600 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 601 601 Assert(enmType == g_pProcessPriority->paTypes[enmType].enmType); 602 602 Assert((pthread_t)pThread->Core.Key == pthread_self()); -
trunk/src/VBox/Runtime/r3/posix/sched-posix.cpp
r1 r403 122 122 * certain). 123 123 */ 124 static const PROCPRIORITYTYPE g_aTypesThread[RTTHREADTYPE_ LAST] =124 static const PROCPRIORITYTYPE g_aTypesThread[RTTHREADTYPE_END] = 125 125 { 126 126 { RTTHREADTYPE_INVALID, -999999999 }, … … 138 138 }; 139 139 140 static const PROCPRIORITYTYPE g_aTypesThreadFlat[RTTHREADTYPE_ LAST] =140 static const PROCPRIORITYTYPE g_aTypesThreadFlat[RTTHREADTYPE_END] = 141 141 { 142 142 { RTTHREADTYPE_INVALID, ~0 }, … … 184 184 * to only be lowering the priority. 185 185 */ 186 static const PROCPRIORITYTYPE g_aTypesUnixFree[RTTHREADTYPE_ LAST] =186 static const PROCPRIORITYTYPE g_aTypesUnixFree[RTTHREADTYPE_END] = 187 187 { 188 188 { RTTHREADTYPE_INVALID, -999999999 }, … … 204 204 * to only be lowering the priority. 205 205 */ 206 static const PROCPRIORITYTYPE g_aTypesUnixRestricted[RTTHREADTYPE_ LAST] =206 static const PROCPRIORITYTYPE g_aTypesUnixRestricted[RTTHREADTYPE_END] = 207 207 { 208 208 { RTTHREADTYPE_INVALID, -999999999 }, … … 224 224 * to only be lowering the priority. 225 225 */ 226 static const PROCPRIORITYTYPE g_aTypesUnixFlat[RTTHREADTYPE_ LAST] =226 static const PROCPRIORITYTYPE g_aTypesUnixFlat[RTTHREADTYPE_END] = 227 227 { 228 228 { RTTHREADTYPE_INVALID, -999999999 }, … … 506 506 int rtSchedNativeCalcDefaultPriority(RTTHREADTYPE enmType) 507 507 { 508 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);508 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 509 509 510 510 /* … … 584 584 int iMin = sched_get_priority_min(SavedPriority.iPolicy); 585 585 pthread_t Self = pthread_self(); 586 for (int i = RTTHREADTYPE_INVALID + 1; i < RTTHREADTYPE_ LAST; i++)586 for (int i = RTTHREADTYPE_INVALID + 1; i < RTTHREADTYPE_END; i++) 587 587 { 588 588 struct sched_param SchedParam = SavedPriority.PthreadSchedParam; … … 607 607 case OSPRIOSUP_THREAD_LEVEL: 608 608 { 609 int i = RTTHREADTYPE_ LAST;609 int i = RTTHREADTYPE_END; 610 610 while (--i > RTTHREADTYPE_INVALID) 611 611 { … … 737 737 int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType) 738 738 { 739 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);739 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 740 740 Assert(enmType == g_pProcessPriority->paTypes[enmType].enmType); 741 741 Assert((pthread_t)pThread->Core.Key == pthread_self()); -
trunk/src/VBox/Runtime/r3/win32/sched-win32.cpp
r1 r403 61 61 /** The Win32 thread priority. */ 62 62 DWORD dwThreadPriority; 63 } aTypes[RTTHREADTYPE_ LAST];63 } aTypes[RTTHREADTYPE_END]; 64 64 } PROCPRIORITY; 65 65 … … 254 254 int rtSchedNativeCalcDefaultPriority(RTTHREADTYPE enmType) 255 255 { 256 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);256 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 257 257 return VINF_SUCCESS; 258 258 } … … 303 303 int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType) 304 304 { 305 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_ LAST);305 Assert(enmType > RTTHREADTYPE_INVALID && enmType < RTTHREADTYPE_END); 306 306 AssertMsg(g_pProcessPriority && g_pProcessPriority->aTypes[enmType].enmType == enmType, 307 307 ("enmType=%d entry=%d\n", enmType, g_pProcessPriority->aTypes[enmType].enmType)); -
trunk/src/VBox/Runtime/thread.cpp
r1 r403 32 32 #include <iprt/assert.h> 33 33 #include <iprt/semaphore.h> 34 #ifdef IN_RING0 35 # include <iprt/spinlock.h> 36 #endif 34 37 #include <iprt/asm.h> 35 38 #include <iprt/err.h> … … 43 46 * Defined Constants And Macros * 44 47 *******************************************************************************/ 45 #define RT_THREAD_LOCK_RW() rtThreadLockRW() 46 #define RT_THREAD_UNLOCK_RW() rtThreadUnLockRW() 47 #define RT_THREAD_LOCK_RD() rtThreadLockRD() 48 #define RT_THREAD_UNLOCK_RD() rtThreadUnLockRD() 48 #ifdef IN_RING0 49 # define RT_THREAD_LOCK_TMP(Tmp) RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER 50 # define RT_THREAD_LOCK_RW(Tmp) RTSpinlockAcquireNoInts(g_ThreadSpinlock, &(Tmp)) 51 # define RT_THREAD_UNLOCK_RW(Tmp) RTSpinlockReleaseNoInts(g_ThreadSpinlock, &(Tmp)) 52 # define RT_THREAD_LOCK_RD(Tmp) RTSpinlockAcquireNoInts(g_ThreadSpinlock, &(Tmp)) 53 # define RT_THREAD_UNLOCK_RD(Tmp) RTSpinlockReleaseNoInts(g_ThreadSpinlock, &(Tmp)) 54 #else 55 # define RT_THREAD_LOCK_TMP(Tmp) 56 # define RT_THREAD_LOCK_RW(Tmp) rtThreadLockRW() 57 # define RT_THREAD_UNLOCK_RW(Tmp) rtThreadUnLockRW() 58 # define RT_THREAD_LOCK_RD(Tmp) rtThreadLockRD() 59 # define RT_THREAD_UNLOCK_RD(Tmp) rtThreadUnLockRD() 60 #endif 49 61 50 62 … … 54 66 /** The AVL thread containing the threads. */ 55 67 static PAVLPVNODECORE g_ThreadTree; 68 #ifdef IN_RING3 56 69 /** The RW lock protecting the tree. */ 57 70 static RTSEMRW g_ThreadRWSem = NIL_RTSEMRW; 71 #else 72 /** The spinlocks protecting the tree. */ 73 static RTSPINLOCK g_ThreadSpinlock = NIL_RTSPINLOCK; 74 #endif 58 75 59 76 … … 87 104 * thread id. RTThreadSelf() then have to be implemented using a pointer stored 88 105 * in thread local storage (TLS). 89 */ 90 91 92 /** 93 * Initializes the thread data base. 106 * 107 * In Ring-0 we only try keep track of kernel threads created by RTCreateThread 108 * at the moment. There we really only need the 'join' feature, but doing things 109 * the same way allow us to name threads and similar stuff. 110 */ 111 112 113 /** 114 * Initializes the thread database. 94 115 * 95 116 * @returns iprt status code. … … 97 118 int rtThreadInit(void) 98 119 { 120 #ifdef IN_RING3 99 121 int rc = VINF_ALREADY_INITIALIZED; 100 122 if (g_ThreadRWSem == NIL_RTSEMRW) … … 108 130 { 109 131 rc = rtThreadNativeInit(); 132 #ifdef IN_RING3 110 133 if (RT_SUCCESS(rc)) 111 134 rc = rtThreadAdopt(RTTHREADTYPE_DEFAULT, 0, "main"); 112 135 if (RT_SUCCESS(rc)) 113 136 rc = rtSchedNativeCalcDefaultPriority(RTTHREADTYPE_DEFAULT); 137 #endif 114 138 if (RT_SUCCESS(rc)) 115 139 return VINF_SUCCESS; … … 120 144 } 121 145 } 122 return rc; 123 } 146 147 #elif defined(IN_RING0) 148 149 /* 150 * Create the spinlock and to native init. 151 */ 152 Assert(g_ThreadSpinlock == NIL_RTSPINLOCK); 153 int rc = RTSpinlockCreate(&g_ThreadSpinlock); 154 if (RT_SUCCESS(rc)) 155 { 156 rc = rtThreadNativeInit(); 157 if (RT_SUCCESS(rc)) 158 return VINF_SUCCESS; 159 160 /* failed, clear out */ 161 RTSpinlockDestroy(g_ThreadSpinlock); 162 g_ThreadSpinlock = NIL_RTSPINLOCK; 163 } 164 #else 165 # error "!IN_RING0 && !IN_RING3" 166 #endif 167 return rc; 168 } 169 170 171 /** 172 * Terminates the thread database. 173 */ 174 void rtThreadTerm(void) 175 { 176 #ifdef IN_RING3 177 /* we don't cleanup here yet */ 178 179 #elif defined(IN_RING0) 180 /* just destroy the spinlock and assume the thread is fine... */ 181 RTSpinlockDestroy(g_ThreadSpinlock); 182 g_ThreadSpinlock = NIL_RTSPINLOCK; 183 if (g_ThreadTree != NULL) 184 AssertMsg2("WARNING: g_ThreadTree=%p\n", g_ThreadTree); 185 #endif 186 } 187 188 189 190 #ifdef IN_RING3 191 192 inline void rtThreadLockRW(void) 193 { 194 if (g_ThreadRWSem == NIL_RTSEMRW) 195 rtThreadInit(); 196 int rc = RTSemRWRequestWrite(g_ThreadRWSem, RT_INDEFINITE_WAIT); 197 AssertReleaseRC(rc); 198 } 199 200 201 inline void rtThreadLockRD(void) 202 { 203 if (g_ThreadRWSem == NIL_RTSEMRW) 204 rtThreadInit(); 205 int rc = RTSemRWRequestRead(g_ThreadRWSem, RT_INDEFINITE_WAIT); 206 AssertReleaseRC(rc); 207 } 208 209 210 inline void rtThreadUnLockRW(void) 211 { 212 int rc = RTSemRWReleaseWrite(g_ThreadRWSem); 213 AssertReleaseRC(rc); 214 } 215 216 217 inline void rtThreadUnLockRD(void) 218 { 219 int rc = RTSemRWReleaseRead(g_ThreadRWSem); 220 AssertReleaseRC(rc); 221 } 222 223 #endif /* IN_RING3 */ 124 224 125 225 … … 193 293 *pThread = Thread; 194 294 return rc; 195 }196 197 198 inline void rtThreadLockRW(void)199 {200 if (!g_ThreadRWSem)201 rtThreadInit();202 int rc = RTSemRWRequestWrite(g_ThreadRWSem, RT_INDEFINITE_WAIT);203 AssertReleaseRC(rc);204 }205 206 207 inline void rtThreadLockRD(void)208 {209 if (!g_ThreadRWSem)210 rtThreadInit();211 int rc = RTSemRWRequestRead(g_ThreadRWSem, RT_INDEFINITE_WAIT);212 AssertReleaseRC(rc);213 }214 215 216 inline void rtThreadUnLockRW(void)217 {218 int rc = RTSemRWReleaseWrite(g_ThreadRWSem);219 AssertReleaseRC(rc);220 }221 222 223 inline void rtThreadUnLockRD(void)224 {225 int rc = RTSemRWReleaseRead(g_ThreadRWSem);226 AssertReleaseRC(rc);227 295 } 228 296 … … 285 353 Assert(pThread->u32Magic == RTTHREADINT_MAGIC); 286 354 287 RT_THREAD_LOCK_RW(); 355 RT_THREAD_LOCK_TMP(Tmp); 356 RT_THREAD_LOCK_RW(Tmp); 288 357 289 358 /* … … 317 386 } 318 387 319 RT_THREAD_UNLOCK_RW( );388 RT_THREAD_UNLOCK_RW(Tmp); 320 389 } 321 390 … … 343 412 static void rtThreadRemove(PRTTHREADINT pThread) 344 413 { 345 RT_THREAD_LOCK_RW(); 414 RT_THREAD_LOCK_TMP(Tmp); 415 RT_THREAD_LOCK_RW(Tmp); 346 416 if (ASMAtomicBitTestAndClear(&pThread->fIntFlags, RTTHREADINT_FLAG_IN_TREE_BIT)) 347 417 rtThreadRemoveLocked(pThread); 348 RT_THREAD_UNLOCK_RW( );418 RT_THREAD_UNLOCK_RW(Tmp); 349 419 } 350 420 … … 374 444 * Simple tree lookup. 375 445 */ 376 RT_THREAD_LOCK_RD(); 446 RT_THREAD_LOCK_TMP(Tmp); 447 RT_THREAD_LOCK_RD(Tmp); 377 448 PRTTHREADINT pThread = (PRTTHREADINT)RTAvlPVGet(&g_ThreadTree, (void *)NativeThread); 378 RT_THREAD_UNLOCK_RD( );449 RT_THREAD_UNLOCK_RD(Tmp); 379 450 return pThread; 380 451 } … … 507 578 */ 508 579 int rc = rtThreadNativeSetPriority(pThread, pThread->enmType); 580 #ifdef IN_RING3 509 581 AssertMsgRC(rc, ("Failed to set priority of thread %p (%RTnthrd / %s) to enmType=%d enmPriority=%d rc=%Vrc\n", 510 582 pThread, NativeThread, pThread->szName, pThread->enmType, g_enmProcessPriority, rc)); 583 #else 584 AssertMsgRC(rc, ("Failed to set priority of thread %p (%RTnthrd / %s) to enmType=%d rc=%Vrc\n", 585 pThread, NativeThread, pThread->szName, pThread->enmType, rc)); 586 #endif 511 587 512 588 /* … … 848 924 * @param prc Where to store the return code of the thread. Optional. 849 925 */ 850 RT R3DECL(int) RTThreadWait(RTTHREAD Thread, unsigned cMillies, int *prc)926 RTDECL(int) RTThreadWait(RTTHREAD Thread, unsigned cMillies, int *prc) 851 927 { 852 928 int rc = rtThreadWait(Thread, cMillies, prc, true); … … 885 961 int rc; 886 962 if ( enmType > RTTHREADTYPE_INVALID 887 && enmType < RTTHREADTYPE_ LAST)963 && enmType < RTTHREADTYPE_END) 888 964 { 889 965 PRTTHREADINT pThread = rtThreadGet(Thread); … … 895 971 * Do the job. 896 972 */ 897 RT_THREAD_UNLOCK_RW(); 973 RT_THREAD_LOCK_TMP(Tmp); 974 RT_THREAD_LOCK_RW(Tmp); 898 975 rc = rtThreadNativeSetPriority(pThread, enmType); 899 976 if (RT_SUCCESS(rc)) 900 977 ASMAtomicXchgSize(&pThread->enmType, enmType); 901 else 978 RT_THREAD_UNLOCK_RW(Tmp); 979 if (RT_FAILURE(rc)) 902 980 Log(("RTThreadSetType: failed on thread %p (%s), rc=%Vrc!!!\n", Thread, pThread->szName, rc)); 903 RT_THREAD_LOCK_RW();904 981 } 905 982 else … … 939 1016 940 1017 1018 #ifdef IN_RING3 1019 941 1020 /** 942 1021 * Recalculates scheduling attributes for the the default process … … 951 1030 int rtThreadDoCalcDefaultPriority(RTTHREADTYPE enmType) 952 1031 { 953 RT_THREAD_LOCK_RW(); 1032 RT_THREAD_LOCK_TMP(Tmp); 1033 RT_THREAD_LOCK_RW(Tmp); 954 1034 int rc = rtSchedNativeCalcDefaultPriority(enmType); 955 RT_THREAD_UNLOCK_RW( );1035 RT_THREAD_UNLOCK_RW(Tmp); 956 1036 return rc; 957 1037 } … … 997 1077 * scheduling attributes defined by the specified process priority. 998 1078 */ 999 RT_THREAD_LOCK_RW(); 1079 RT_THREAD_LOCK_TMP(Tmp); 1080 RT_THREAD_LOCK_RW(Tmp); 1000 1081 int rc = rtProcNativeSetPriority(enmPriority); 1001 1082 if (RT_SUCCESS(rc)) … … 1016 1097 } 1017 1098 } 1018 RT_THREAD_UNLOCK_RW( );1099 RT_THREAD_UNLOCK_RW(Tmp); 1019 1100 LogFlow(("rtThreadDoSetProcPriority: returns %Vrc\n", rc)); 1020 1101 return rc; … … 1215 1296 } 1216 1297 1298 #endif /* IN_RING3 */ 1299
Note:
See TracChangeset
for help on using the changeset viewer.