diff options
Diffstat (limited to 'config/os/macosx/pThreadUtilities.h')
-rw-r--r-- | config/os/macosx/pThreadUtilities.h | 333 |
1 files changed, 166 insertions, 167 deletions
diff --git a/config/os/macosx/pThreadUtilities.h b/config/os/macosx/pThreadUtilities.h index bd1d1e8..a8ed705 100644 --- a/config/os/macosx/pThreadUtilities.h +++ b/config/os/macosx/pThreadUtilities.h @@ -1,65 +1,65 @@ /* - Copyright: © Copyright 2002 Apple Computer, Inc. All rights - reserved. - - Disclaimer: IMPORTANT: This Apple software is supplied to - you by Apple Computer, Inc. ("Apple") in - consideration of your agreement to the - following terms, and your use, installation, - modification or redistribution of this Apple - software constitutes acceptance of these - terms. If you do not agree with these terms, - please do not use, install, modify or - redistribute this Apple software. - - In consideration of your agreement to abide by - the following terms, and subject to these - terms, Apple grants you a personal, - non-exclusive license, under AppleÕs - copyrights in this original Apple software - (the "Apple Software"), to use, reproduce, - modify and redistribute the Apple Software, - with or without modifications, in source - and/or binary forms; provided that if you - redistribute the Apple Software in its - entirety and without modifications, you must - retain this notice and the following text and - disclaimers in all such redistributions of the - Apple Software. Neither the name, trademarks, - service marks or logos of Apple Computer, - Inc. may be used to endorse or promote - products derived from the Apple Software - without specific prior written permission from - Apple. Except as expressly stated in this - notice, no other rights or licenses, express - or implied, are granted by Apple herein, - including but not limited to any patent rights - that may be infringed by your derivative works - or by other works in which the Apple Software - may be incorporated. - - The Apple Software is provided by Apple on an - "AS IS" basis. APPLE MAKES NO WARRANTIES, - EXPRESS OR IMPLIED, INCLUDING WITHOUT - LIMITATION THE IMPLIED WARRANTIES OF - NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE, REGARDING THE APPLE - SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY - SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) ARISING IN ANY WAY OUT OF THE - USE, REPRODUCTION, MODIFICATION AND/OR - DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER - CAUSED AND WHETHER UNDER THEORY OF CONTRACT, - TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY - OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED - OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + Copyright: © Copyright 2002 Apple Computer, Inc. All rights + reserved. + + Disclaimer: IMPORTANT: This Apple software is supplied to + you by Apple Computer, Inc. ("Apple") in + consideration of your agreement to the + following terms, and your use, installation, + modification or redistribution of this Apple + software constitutes acceptance of these + terms. If you do not agree with these terms, + please do not use, install, modify or + redistribute this Apple software. + + In consideration of your agreement to abide by + the following terms, and subject to these + terms, Apple grants you a personal, + non-exclusive license, under AppleÕs + copyrights in this original Apple software + (the "Apple Software"), to use, reproduce, + modify and redistribute the Apple Software, + with or without modifications, in source + and/or binary forms; provided that if you + redistribute the Apple Software in its + entirety and without modifications, you must + retain this notice and the following text and + disclaimers in all such redistributions of the + Apple Software. Neither the name, trademarks, + service marks or logos of Apple Computer, + Inc. may be used to endorse or promote + products derived from the Apple Software + without specific prior written permission from + Apple. Except as expressly stated in this + notice, no other rights or licenses, express + or implied, are granted by Apple herein, + including but not limited to any patent rights + that may be infringed by your derivative works + or by other works in which the Apple Software + may be incorporated. + + The Apple Software is provided by Apple on an + "AS IS" basis. APPLE MAKES NO WARRANTIES, + EXPRESS OR IMPLIED, INCLUDING WITHOUT + LIMITATION THE IMPLIED WARRANTIES OF + NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE, REGARDING THE APPLE + SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY + SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) ARISING IN ANY WAY OUT OF THE + USE, REPRODUCTION, MODIFICATION AND/OR + DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER + CAUSED AND WHETHER UNDER THEORY OF CONTRACT, + TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY + OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + */ /* pThreadUtilities.h */ #ifndef __PTHREADUTILITIES_H__ @@ -68,8 +68,8 @@ #import "pthread.h" #import <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacTypes.h> -#define THREAD_SET_PRIORITY 0 -#define THREAD_SCHEDULED_PRIORITY 1 +#define THREAD_SET_PRIORITY 0 +#define THREAD_SCHEDULED_PRIORITY 1 #include <mach/mach_error.h> #include <mach/thread_policy.h> @@ -77,127 +77,126 @@ #include <CoreAudio/HostTime.h> static inline UInt32 -_getThreadPriority(pthread_t inThread, int inWhichPriority) +_getThreadPriority (pthread_t inThread, int inWhichPriority) { - thread_basic_info_data_t threadInfo; - policy_info_data_t thePolicyInfo; - unsigned int count; - - // get basic info - count = THREAD_BASIC_INFO_COUNT; - thread_info (pthread_mach_thread_np (inThread), THREAD_BASIC_INFO, - (thread_info_t)&threadInfo, &count); - - switch (threadInfo.policy) { - case POLICY_TIMESHARE: - count = POLICY_TIMESHARE_INFO_COUNT; - thread_info(pthread_mach_thread_np (inThread), - THREAD_SCHED_TIMESHARE_INFO, - (thread_info_t)&(thePolicyInfo.ts), &count); - if (inWhichPriority == THREAD_SCHEDULED_PRIORITY) { - return thePolicyInfo.ts.cur_priority; - } else { - return thePolicyInfo.ts.base_priority; - } - break; - - case POLICY_FIFO: - count = POLICY_FIFO_INFO_COUNT; - thread_info(pthread_mach_thread_np (inThread), - THREAD_SCHED_FIFO_INFO, - (thread_info_t)&(thePolicyInfo.fifo), &count); - if ( (thePolicyInfo.fifo.depressed) - && (inWhichPriority == THREAD_SCHEDULED_PRIORITY) ) { - return thePolicyInfo.fifo.depress_priority; - } - return thePolicyInfo.fifo.base_priority; - break; - - case POLICY_RR: - count = POLICY_RR_INFO_COUNT; - thread_info(pthread_mach_thread_np (inThread), - THREAD_SCHED_RR_INFO, - (thread_info_t)&(thePolicyInfo.rr), &count); - if ( (thePolicyInfo.rr.depressed) - && (inWhichPriority == THREAD_SCHEDULED_PRIORITY) ) { - return thePolicyInfo.rr.depress_priority; - } - return thePolicyInfo.rr.base_priority; - break; - } - - return 0; + thread_basic_info_data_t threadInfo; + policy_info_data_t thePolicyInfo; + unsigned int count; + + // get basic info + count = THREAD_BASIC_INFO_COUNT; + thread_info (pthread_mach_thread_np (inThread), THREAD_BASIC_INFO, + (thread_info_t)&threadInfo, &count); + + switch (threadInfo.policy) { + case POLICY_TIMESHARE: + count = POLICY_TIMESHARE_INFO_COUNT; + thread_info (pthread_mach_thread_np (inThread), + THREAD_SCHED_TIMESHARE_INFO, + (thread_info_t)&(thePolicyInfo.ts), &count); + if (inWhichPriority == THREAD_SCHEDULED_PRIORITY) { + return thePolicyInfo.ts.cur_priority; + } else { + return thePolicyInfo.ts.base_priority; + } + break; + + case POLICY_FIFO: + count = POLICY_FIFO_INFO_COUNT; + thread_info (pthread_mach_thread_np (inThread), + THREAD_SCHED_FIFO_INFO, + (thread_info_t)&(thePolicyInfo.fifo), &count); + if ( (thePolicyInfo.fifo.depressed) + && (inWhichPriority == THREAD_SCHEDULED_PRIORITY) ) { + return thePolicyInfo.fifo.depress_priority; + } + return thePolicyInfo.fifo.base_priority; + break; + + case POLICY_RR: + count = POLICY_RR_INFO_COUNT; + thread_info (pthread_mach_thread_np (inThread), + THREAD_SCHED_RR_INFO, + (thread_info_t)&(thePolicyInfo.rr), &count); + if ( (thePolicyInfo.rr.depressed) + && (inWhichPriority == THREAD_SCHEDULED_PRIORITY) ) { + return thePolicyInfo.rr.depress_priority; + } + return thePolicyInfo.rr.base_priority; + break; + } + + return 0; } // returns the thread's priority as it was last set by the API static inline UInt32 -getThreadSetPriority(pthread_t inThread) +getThreadSetPriority (pthread_t inThread) { - return _getThreadPriority (inThread, THREAD_SET_PRIORITY); + return _getThreadPriority (inThread, THREAD_SET_PRIORITY); } // returns the thread's priority as it was last scheduled by the Kernel static inline UInt32 -getThreadScheduledPriority(pthread_t inThread) +getThreadScheduledPriority (pthread_t inThread) { - return _getThreadPriority (inThread, THREAD_SCHEDULED_PRIORITY); + return _getThreadPriority (inThread, THREAD_SCHEDULED_PRIORITY); } static inline void -setThreadToPriority(pthread_t inThread, UInt32 inPriority, Boolean inIsFixed, - UInt64 inHALIOProcCycleDurationInNanoseconds) +setThreadToPriority (pthread_t inThread, UInt32 inPriority, Boolean inIsFixed, + UInt64 inHALIOProcCycleDurationInNanoseconds) { - if (inPriority == 96) - { - // REAL-TIME / TIME-CONSTRAINT THREAD - thread_time_constraint_policy_data_t theTCPolicy; - UInt64 theComputeQuanta; - UInt64 thePeriod; - UInt64 thePeriodNanos; - - thePeriodNanos = inHALIOProcCycleDurationInNanoseconds; - theComputeQuanta = AudioConvertNanosToHostTime ( thePeriodNanos * 0.15 ); - thePeriod = AudioConvertNanosToHostTime (thePeriodNanos); - - theTCPolicy.period = thePeriod; - theTCPolicy.computation = theComputeQuanta; - theTCPolicy.constraint = thePeriod; - theTCPolicy.preemptible = true; - thread_policy_set (pthread_mach_thread_np(inThread), - THREAD_TIME_CONSTRAINT_POLICY, - (thread_policy_t)&theTCPolicy, - THREAD_TIME_CONSTRAINT_POLICY_COUNT); + if (inPriority == 96) { + // REAL-TIME / TIME-CONSTRAINT THREAD + thread_time_constraint_policy_data_t theTCPolicy; + UInt64 theComputeQuanta; + UInt64 thePeriod; + UInt64 thePeriodNanos; + + thePeriodNanos = inHALIOProcCycleDurationInNanoseconds; + theComputeQuanta = AudioConvertNanosToHostTime ( thePeriodNanos * 0.15 ); + thePeriod = AudioConvertNanosToHostTime (thePeriodNanos); + + theTCPolicy.period = thePeriod; + theTCPolicy.computation = theComputeQuanta; + theTCPolicy.constraint = thePeriod; + theTCPolicy.preemptible = true; + thread_policy_set (pthread_mach_thread_np (inThread), + THREAD_TIME_CONSTRAINT_POLICY, + (thread_policy_t)&theTCPolicy, + THREAD_TIME_CONSTRAINT_POLICY_COUNT); } else { - // OTHER THREADS - thread_extended_policy_data_t theFixedPolicy; - thread_precedence_policy_data_t thePrecedencePolicy; - SInt32 relativePriority; - - // [1] SET FIXED / NOT FIXED - theFixedPolicy.timeshare = !inIsFixed; - thread_policy_set (pthread_mach_thread_np(inThread), - THREAD_EXTENDED_POLICY, - (thread_policy_t)&theFixedPolicy, - THREAD_EXTENDED_POLICY_COUNT); - - // [2] SET PRECEDENCE N.B.: We expect that if thread A - // created thread B, and the program wishes to change the - // priority of thread B, then the call to change the - // priority of thread B must be made by thread A. This - // assumption allows us to use pthread_self() to correctly - // calculate the priority of the feeder thread (since - // precedency policy's importance is relative to the - // spawning thread's priority.) - relativePriority = inPriority - - getThreadSetPriority (pthread_self()); - - thePrecedencePolicy.importance = relativePriority; - thread_policy_set (pthread_mach_thread_np(inThread), - THREAD_PRECEDENCE_POLICY, - (thread_policy_t)&thePrecedencePolicy, - THREAD_PRECEDENCE_POLICY_COUNT); + // OTHER THREADS + thread_extended_policy_data_t theFixedPolicy; + thread_precedence_policy_data_t thePrecedencePolicy; + SInt32 relativePriority; + + // [1] SET FIXED / NOT FIXED + theFixedPolicy.timeshare = !inIsFixed; + thread_policy_set (pthread_mach_thread_np (inThread), + THREAD_EXTENDED_POLICY, + (thread_policy_t)&theFixedPolicy, + THREAD_EXTENDED_POLICY_COUNT); + + // [2] SET PRECEDENCE N.B.: We expect that if thread A + // created thread B, and the program wishes to change the + // priority of thread B, then the call to change the + // priority of thread B must be made by thread A. This + // assumption allows us to use pthread_self() to correctly + // calculate the priority of the feeder thread (since + // precedency policy's importance is relative to the + // spawning thread's priority.) + relativePriority = inPriority - + getThreadSetPriority (pthread_self ()); + + thePrecedencePolicy.importance = relativePriority; + thread_policy_set (pthread_mach_thread_np (inThread), + THREAD_PRECEDENCE_POLICY, + (thread_policy_t)&thePrecedencePolicy, + THREAD_PRECEDENCE_POLICY_COUNT); } } -#endif /* __PTHREADUTILITIES_H__ */ +#endif /* __PTHREADUTILITIES_H__ */ |