File: MachSetTimeConstraintPriority.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (102 lines) | stat: -rw-r--r-- 5,122 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
function MachSetTimeConstraintPriority(periodSecs,computationSecs, constraintSecs, preemptibleFlag)

% MachSetTimeConstraintPriority(periodSecs,computationSecs, constraintSecs, preemptibleFlag)
%
% Assign the main MATLAB thread "time constraint" status, giving it super
% priority  over other threads on the system.  A thread given "time
% constraint" status  can not be preempted by other threads and cedes CPU
% time to them on its own terms.  
%
%  MachSetTimeConstraintPriority guarantees that within any block of 
% "periodSecs" consecutive seconds the MATLAB thread is granted at least
% computationSecs seconds of CPU time.  
%
% Use "constraintSecs" to specify how  "computationSecs" of CPU time is
% distributed throughought  the period "periodSecs". If the CPU time
% specified by "computationSecs" were broken and spread throught the entire
% interval "periodSecs", then the actual time to complete the
% calculationSecs of computation will be greater than computationSecs
% itself;    computationSecs of CPU usage could require up to periodSecs to
% complete. Argument "constraintSecs" specifies a period in which
% computationSecs of CPU usage  is guranteed  to complete.  Note that
% constraintSecs must be >= computationSecs because computationSecs of CPU
% usage can not complete in less than  computationSecs. The maximum latency
% from the start of a computation to the end is constraintSecs -
% computationSecs.
%
% Setting the preemptibleFlag flag allows MATLAB to be interrupted subject
% to constraintConstraint.   
%
% Granting a thread "time constraint" priority status gives it unlimited
% and uninterruptable   control of the CPU, regardless of the limits
% specified by arguments to MachSetTimeConstraintPriority.  If a thread
% exceeds the limits on CPU time usage as specfied  by arguments to
% MachSetTimeConstraintPriority then the Mach Kernel's task  scheduler will
% eventually notice a problem and revoke "time constraint" priority status.
% On a dual 1.2 GHz G4 running OS X 10.2 the Mach task scheduler demotes
% MATLAB to standard priority after 2.5 seconds of uninterrrupted loop
% execution at "time constraint" priority.   
%
% For your script to abide  by CPU time usage limits set by arguments to
% MachSetTimeConstraintPriority it is necessary that it limit its own use
% of CPU time by calling blocking functions which surrender CPU time to
% other applications.    Use "BlockSecsMex" to surrender a specified period
% of time or use  Use Screen('Flip') to surrender time until the next video
% blanking interval. MATLAB when idle at the command line will
% automatically block.
%
% MachSetTimeConstraintPriority is primarily intended to be used with 
% Screen('CopyWindow') animations to avoid interruptions for periods long
% enough to cause your animation script to miss an entire video frame.  
% For animations:
%       periodSecs- should be set to the video frame period as obtained
%       with 1/Screen('FrameRate').
%
%       computationSecs- should exceed the maximum amount of time which
%       your  script requires to render any single video frame. 
%
%       constraintSecs need only be greater than computationSecs and less
%       than or equal to  periodSecs, within those limits should not effect
%       performance.    
%
% MachSetTimeConstraintPriority should be called immediatly before the
% start of  the animation loop.  To restore standard priority status to
% MATLAB after the  animation ends use "MachSetStandardPriority"
%
% MachSetTimeConstraintPriority converts time arguments specified in units
% of seconds to units of bus ticks and calls MachSetPriorityMex.
% MachSetPriorityMex, in turn, invokes the OS X call thread_policy_set with
% the THREAD_TIME_CONSTRAINT_POLICY constant. For more info on
% thread_policy_set see:
%   Psychtoolbox3/Source/Common/MachPriorityMex/MachGetPriorityMex.c
%   http://developer.apple.com/documentation/Darwin/Conceptual/KernelProgramming/scheduler/chapter_8_section_4.html
%   /usr/include/mach/thread_policy.h 
%
% SEE ALSO: MachSetStandardPriority, MachSetPriorityMex, BlockSecsMex
%
% AUTHORS:
% Allen Ingling     awi     Allen.Ingling@nyu.edu
% Mario Kleiner     mk
%
% HISTORY: 
% 8/13/03   awi     Wrote it.
% 2/17/05   mk      bug-fix: constraintSecs argument was ignored.
% 4/6/05    awi     Added Mario's bug fix to Psychtoolbox.org master.
% 4/6/05    awi     Replaced "GetBusFrequencymex" calls with "MachTimebase"
% 4/8/05    awi     Changed "MachTimebase" to "MachAbsoluteTimeClockFrequency"

if ~(nargin==4 || nargin == 0)
    error('wrong number of arguments')
end
if nargin==0  % ths is not documented in the help.  We use default parameters if no arguments are passed.  
    MachSetPriorityMex('THREAD_TIME_CONSTRAINT_POLICY', 'default');
    return
end

ticksPerSecond= MachAbsoluteTimeClockFrequency; 
periodTicks = round(periodSecs * ticksPerSecond);
computationTicks = round(computationSecs * ticksPerSecond);
constraintTicks = round(constraintSecs * ticksPerSecond);
MachSetPriorityMex('THREAD_TIME_CONSTRAINT_POLICY', periodTicks, computationTicks, constraintTicks, preemptibleFlag);