Changeset 13254
- Timestamp:
- 10/14/08 14:35:50 (3 months ago)
- Files:
-
- trunk/include/iprt/err.h (modified) (1 diff)
- trunk/include/iprt/thread.h (modified) (3 diffs)
- trunk/src/VBox/Runtime/Makefile.kmk (modified) (6 diffs)
- trunk/src/VBox/Runtime/common/log/log.cpp (modified) (1 diff)
- trunk/src/VBox/Runtime/r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp (added)
- trunk/src/VBox/Runtime/r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp (added)
- trunk/src/VBox/Runtime/r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp (added)
- trunk/src/VBox/Runtime/r0drv/nt/thread-r0drv-nt.cpp (modified) (1 diff)
- trunk/src/VBox/Runtime/r0drv/solaris/thread-r0drv-solaris.c (modified) (3 diffs)
- trunk/src/VBox/Runtime/r0drv/solaris/vbi/thread-r0drv-solaris.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/include/iprt/err.h
r11725 r13254 479 479 #define VWRN_INVALID_STATE 79 480 480 /** Generic out of resources error. */ 481 #define VERR_OUT_OF_RESOURCES (-80)481 #define VERR_OUT_OF_RESOURCES (-80) 482 482 /** Generic out of resources warning. */ 483 483 #define VWRN_OUT_OF_RESOURCES 80 484 484 /** No more handles available, too many open handles. */ 485 #define VERR_NO_MORE_HANDLES (-81) 485 #define VERR_NO_MORE_HANDLES (-81) 486 /** Preemption is disabled. 487 * The requested operation can only be performed when preemption is enabled. */ 488 #define VERR_PREEMPT_DISABLED (-82) 486 489 /** @} */ 487 490 trunk/include/iprt/thread.h
r11596 r13254 217 217 218 218 /** 219 * Create a new thread. 220 * 219 * Create a new thread. 220 * 221 221 * Same as RTThreadCreate except the name is given in the RTStrPrintfV form. 222 222 * … … 235 235 236 236 /** 237 * Create a new thread. 238 * 237 * Create a new thread. 238 * 239 239 * Same as RTThreadCreate except the name is given in the RTStrPrintf form. 240 240 * … … 372 372 RTDECL(int) RTThreadUserReset(RTTHREAD Thread); 373 373 374 #ifdef IN_RING0 375 376 /** 377 * Check if preemption is currently enabled or not for the current thread. 378 * 379 * @returns true if preemtion is enabled, false if preemetion is disabled. 380 * @param hThread Must be NIL_RTTHREAD for now. 381 */ 382 RTDECL(bool) RTThreadPreemptIsEnabled(RTTHREAD hThread); 383 384 /** 385 * Preemption state saved by RTThreadPreemptDisable and used by 386 * RTThreadPreemptRestore to restore the previous state. 387 */ 388 typedef struct RTTHREADPREEMPTSTATE 389 { 390 #ifdef RT_OS_WINDOWS 391 /** The old IRQL. Don't touch. */ 392 unsigned char uchOldIrql; 393 # define RTTHREADPREEMPTSTATE_INITIALIZER { 255 } 394 #else 395 /** Dummy unused placeholder. */ 396 unsigned char uchDummy; 397 # define RTTHREADPREEMPTSTATE_INITIALIZER { 0 } 398 #endif 399 } RTTHREADPREEMPTSTATE; 400 /** Pointer to a preemption state. */ 401 typedef RTTHREADPREEMPTSTATE *PRTTHREADPREEMPTSTATE; 402 403 /** 404 * Disable preemption. 405 * 406 * A call to this function must be matched by exactly one call to 407 * RTThreadPreemptRestore(). 408 * 409 * @param pState Where to store the preemption state. 410 */ 411 RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState); 412 413 /** 414 * Restores the preemption state, undoing a previous call to 415 * RTThreadPreemptDisable. 416 * 417 * A call to this function must be matching a previous call to 418 * RTThreadPreemptDisable. 419 * 420 * @param pState The state return by RTThreadPreemptDisable. 421 */ 422 RTDECL(void) RTThreadPreemptRestore(PRTTHREADPREEMPTSTATE pState); 423 424 #endif /* IN_RING0 */ 425 374 426 375 427 #ifdef IN_RING3 trunk/src/VBox/Runtime/Makefile.kmk
r13248 r13254 976 976 generic/RTLogWriteStdOut-stub-generic.cpp \ 977 977 generic/mppresent-generic.cpp \ 978 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 979 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 980 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 978 981 r0drv/linux/alloc-r0drv-linux.c \ 979 982 r0drv/linux/initterm-r0drv-linux.c \ … … 1010 1013 r0drv/memobj-r0drv.cpp \ 1011 1014 r0drv/mpnotification-r0drv.c \ 1015 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 1016 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 1017 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 1012 1018 r0drv/nt/alloc-r0drv-nt.cpp \ 1013 1019 r0drv/nt/assert-r0drv-nt.cpp \ … … 1054 1060 generic/timer-generic.cpp \ 1055 1061 r0drv/generic/RTMpOn-r0drv-generic.cpp \ 1062 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 1063 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 1064 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 1056 1065 r0drv/generic/mpnotification-r0drv-generic.cpp \ 1057 1066 r0drv/darwin/alloc-r0drv-darwin.cpp \ … … 1103 1112 r0drv/memobj-r0drv.cpp \ 1104 1113 r0drv/generic/RTMpOn-r0drv-generic.cpp \ 1114 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 1115 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 1116 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 1105 1117 r0drv/generic/mpnotification-r0drv-generic.cpp \ 1106 1118 r0drv/os2/alloc-r0drv-os2.cpp \ … … 1149 1161 generic/mppresent-generic.cpp \ 1150 1162 r0drv/generic/RTMpOn-r0drv-generic.cpp \ 1163 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 1164 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 1165 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 1151 1166 r0drv/generic/mpnotification-r0drv-generic.cpp \ 1152 1167 r0drv/freebsd/alloc-r0drv-freebsd.c \ … … 1196 1211 else # !VBOX_WITH_SOLARIS_VBI 1197 1212 RuntimeR0Drv_SOURCES.solaris += \ 1213 r0drv/generic/RTThreadPreemptIsEnabled-r0drv-generic.cpp \ 1214 r0drv/generic/RTThreadPreemptDisable-r0drv-generic.cpp \ 1215 r0drv/generic/RTThreadPreemptRestore-r0drv-generic.cpp \ 1198 1216 r0drv/solaris/mpnotification-r0drv-solaris.c \ 1199 1217 r0drv/solaris/alloc-r0drv-solaris.c \ trunk/src/VBox/Runtime/common/log/log.cpp
r12905 r13254 143 143 if (pLogger->MutexSem != NIL_RTSEMFASTMUTEX) 144 144 { 145 # if defined(IN_RING0) \ 146 && (defined(RT_OS_WINDOWS) || defined(RT_OS_SOLARIS)) 147 if (!RTThreadPreemptIsEnabled()) 148 return VERR_PREEMPT_DISABLED; 149 # endif 145 150 int rc = RTSemFastMutexRequest(pLogger->MutexSem); 146 151 if (RT_FAILURE(rc)) trunk/src/VBox/Runtime/r0drv/nt/thread-r0drv-nt.cpp
r8245 r13254 72 72 73 73 74 RTDECL(bool) RTThreadPreemptIsEnabled(RTTHREAD hThread) 75 { 76 Assert(hThread == NIL_RTTHREAD); 77 KIRQL Irql = KeGetCurrentIrql(); 78 return Irql <= APC_LEVEL; 79 } 80 81 82 RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) 83 { 84 AssertPtr(pState); 85 Assert(pState->uchOldIrql == 255); 86 Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); 87 88 KeRaiseIrql(DISPATCH_LEVEL, &pState->uchOldIrql); 89 } 90 91 92 RTDECL(void) RTThreadPreemptRestore(PRTTHREADPREEMPTSTATE pState) 93 { 94 AssertPtr(pState); 95 96 KeLowerIrql(pState->uchOldIrql); 97 pState->uchOldIrql = 255; 98 } 99 trunk/src/VBox/Runtime/r0drv/solaris/thread-r0drv-solaris.c
r8245 r13254 49 49 clock_t cTicks; 50 50 unsigned long timeout; 51 51 52 52 if (!cMillies) 53 53 { … … 63 63 #if 0 64 64 timeout = ddi_get_lbolt(); 65 timeout += cTicks; 66 65 timeout += cTicks; 66 67 67 kcondvar_t cnd; 68 68 kmutex_t mtx; … … 98 98 } 99 99 100 101 RTDECL(bool) RTThreadPreemptIsEnabled(RTTHREAD hThread) 102 { 103 Assert(hThread == NIL_RTTHREAD); 104 return curthread->t_preempt == 0; 105 } 106 107 108 RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) 109 { 110 AssertPtr(pState); 111 Assert(pState->uchDummy != 42); 112 pState->uchDummy = 42; 113 114 kpreempt_disable(); 115 } 116 117 118 RTDECL(void) RTThreadPreemptRestore(PRTTHREADPREEMPTSTATE pState) 119 { 120 AssertPtr(pState); 121 Assert(pState->uchDummy == 42); 122 pState->uchDummy = 0; 123 124 kpreempt_enable(); 125 } 126 trunk/src/VBox/Runtime/r0drv/solaris/vbi/thread-r0drv-solaris.c
r9176 r13254 62 62 #if 0 63 63 timeout = ddi_get_lbolt(); 64 timeout += cTicks; 65 64 timeout += cTicks; 65 66 66 kcondvar_t cnd; 67 67 kmutex_t mtx; … … 96 96 } 97 97 98 99 RTDECL(bool) RTThreadPreemptIsEnabled(RTTHREAD hThread) 100 { 101 Assert(hThread == NIL_RTTHREAD); 102 return vbi_is_preempt_enabled() != 0; 103 } 104 105 106 RTDECL(void) RTThreadPreemptDisable(PRTTHREADPREEMPTSTATE pState) 107 { 108 AssertPtr(pState); 109 Assert(pState->uchDummy != 42); 110 pState->uchDummy = 42; 111 vbi_preempt_disable(); 112 } 113 114 115 RTDECL(void) RTThreadPreemptRestore(PRTTHREADPREEMPTSTATE pState) 116 { 117 AssertPtr(pState); 118 Assert(pState->uchDummy == 42); 119 pState->uchDummy = 0; 120 vbi_preempt_enable(); 121 } 122

