1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
 13 tc:  proc;
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 % include tcm;
 27 % include hc_lock;
 28 % include apte;
 29 
 30 dcl 1 wci aligned like work_class_info;
 31 
 32 % include work_class_info;
 33 dcl (i, max_wc, wct_base) fixed bin;
 34 dcl  hundth_of_credits fixed bin;
 35 dcl  hundth_of_scatter fixed bin;
 36 dcl (apte_count, sum, wcnum, size_of_wct_entry) fixed bin (35);
 37 dcl  ptwp ptr;
 38 dcl  oldmask fixed bin (71);
 39 dcl  code fixed bin (35);
 40 
 41 dcl  tc_data$ external;
 42 
 43 dcl (
 44      error_table_$action_not_performed,
 45      error_table_$obsolete_function,
 46      error_table_$bad_work_class,
 47      error_table_$bad_arg)
 48      external static fixed bin (35);
 49 
 50 dcl  clock_ entry returns (fixed bin (71));
 51 dcl (pxss$lock_apt, pxss$unlock_apt) entry ();              
 52 
 53 dcl  pmut$wire_and_mask entry (fixed bin (71), ptr);
 54 dcl  pmut$unwire_unmask entry (fixed bin (71), ptr);
 55 dcl  wire_proc$wire_me entry ();
 56 dcl  wire_proc$unwire_me entry ();
 57 
 58 dcl (addr, addrel, bin, divide, fixed, rel, size) builtin;
 59 
 60 
 61 
 62 
 63 
 64 
 65 tune_work_class: entry (a_wctup, a_code);
 66 
 67 dcl  a_wctup ptr;
 68 dcl  wctup ptr;
 69 
 70 dcl 1 wctu_info aligned like work_class_tune_info;
 71 
 72           wctup = a_wctup;
 73           code = 0;
 74           tcmp = addr (tc_data$);
 75           wctu_info = wctup -> work_class_tune_info;
 76           if wctu_info.version < WCTI_version_3 then do;
 77                code = error_table_$obsolete_function;
 78                go to TWC_RETURN;
 79           end;
 80           i = wctu_info.wc_number;
 81           if (i<0) | (i>16) then do;
 82                code = error_table_$bad_work_class;
 83                go to TWC_RETURN;
 84           end;
 85           if ^tcm.wcte (i).defined then do;
 86                code = error_table_$bad_work_class;
 87                go to TWC_RETURN;
 88           end;
 89 
 90           if wctu_info.set.governed then
 91                if wctu_info.max_percent < 0 | wctu_info.max_percent > 100
 92                then do;
 93                     code = error_table_$bad_arg;
 94                     goto TWC_RETURN;
 95                end;
 96 
 97 
 98 
 99 
100           call WIRE_LOCK;                                   
101 
102           if wctu_info.set.resp1 then
103                tcm.wcte (i).resp1 = wctu_info.resp1;
104           if wctu_info.set.resp2 then
105                tcm.wcte (i).resp2 = wctu_info.resp2;
106           if wctu_info.set.quantum1 then
107                tcm.wcte (i).quantum1 = wctu_info.quantum1;
108           if wctu_info.set.quantum2 then
109                tcm.wcte (i).quantum2 = wctu_info.quantum2;
110           if wctu_info.set.purging then
111                if wctu_info.flags.purging then tcm.wcte (i).purging = 1;
112                else tcm.wcte (i).purging = 0;
113           if wctu_info.set.realtime then
114                if wctu_info.flags.realtime then tcm.wcte (i).realtime = 1;
115                else tcm.wcte (i).realtime = 0;
116           if wctu_info.set.maxel then
117                tcm.wcte (i).maxel = wctu_info.maxel;
118           if wctu_info.set.pin_weight then
119                tcm.wcte (i).pin_weight = wctu_info.pin_weight;
120           if wctu_info.set.io_priority then
121                tcm.wcte (i).io_priority = wctu_info.flags.io_priority;
122           if wctu_info.set.governed then do;
123                if wctu_info.max_percent = 0 then
124                     tcm.wcte (i).flags.governed = "0"b;
125                else do;
126                     hundth_of_scatter = divide (tcm.credits_per_scatter, 100, 17);
127                     tcm.wcte (i).maxf = hundth_of_scatter * wctu_info.max_percent;
128                     tcm.wcte (i).governing_credits = 0;
129                     tcm.wcte (i).flags.governed = "1"b;
130                     end;
131                if ^wctu_info.set.interactive_q              
132                     then tcm.wcte (i).flags.interactive_q = ^tcm.wcte (i).flags.governed;
133                end;
134                if wctu_info.set.interactive_q
135                     then tcm.wcte (i).flags.interactive_q = wctu_info.flags.interactive_q;
136 
137 
138           call UNLOCK_UNWIRE;                               
139 
140 TWC_RETURN:
141           a_code = code;
142           return;
143 
144 
145 
146 define_work_classes: entry (a_wcip, a_code);
147 
148 dcl  a_wcip ptr;
149 dcl  a_code fixed bin (35);
150 
151 
152 
153 
154           wcip = a_wcip;
155 
156           wci = work_class_info;
157           wci.error_process_id = ""b;
158           wci.error_work_class = 0;
159           code = 0;
160 
161 
162 
163 
164           if wci.set_user_wc then do;
165                sum = 0;                                     
166                max_wc = 0;                                  
167 
168                do i = 1 to 16;
169                     if wci.user_wc_defined (i) then do;
170                          if wci.user_wc_min_pct (i) <= 0
171                               | (wci.governed (i)
172                                    & (wci.user_wc_max_pct (i) <= 0 | wci.user_wc_max_pct (i) > 100))
173                          then do;
174                               code = error_table_$bad_arg;
175                               go to DWC_RETURN;
176                          end;
177                          sum = sum + wci.user_wc_min_pct (i);
178                          max_wc = i;
179                     end;
180                end;
181           end;
182 
183           if wci.set_system_wc then do;
184                if wci.system_wc_min_pct <= 0 then do;
185                     code = error_table_$bad_arg;
186                     go to DWC_RETURN;
187                end;
188           end;
189 
190           call WIRE_LOCK;                                   
191 
192 
193 
194 
195           aptep = addr (tcm.apt);
196           apte_count = tcm.apt_size;
197           size_of_wct_entry = size (wct_entry);
198           wct_base = fixed (rel (addr (tcm.wcte (0))), 18);
199 
200           if wci.set_user_wc then do;
201                do i = 1 to apte_count;
202                     if ^ apte.flags.idle then               
203                          if bin (apte.flags.state, 18) ^= 0 then 
204                               if bin (apte.flags.state, 18) ^= 5 then do; 
205                                    wcnum = divide (fixed (apte.wct_index, 18) - wct_base, size_of_wct_entry, 17, 0);
206                                    if wcnum > 0 then do;
207                                         if ^ wci.user_wc_defined (wcnum) then do;
208                                              wci.error_process_id = apte.processid;
209                                              wci.error_work_class = wcnum;
210                                              go to DWC_UU_RETURN;
211                                         end;
212                                    end;
213                               end;
214                     aptep = addrel (aptep, tcm.apt_entry_size); 
215                end;
216 
217                tcm.max_wct_index = rel (addr (tcm.wcte (max_wc)));
218 
219                if sum ^= 0 then                             
220                     hundth_of_credits = divide (tcm.credits_per_scatter, sum, 17, 0);
221                else hundth_of_credits = 0;                  
222                hundth_of_scatter = divide (tcm.credits_per_scatter, 100, 17, 0);
223 
224 
225 
226 
227                do i = 1 to 16;
228                     if wci.user_wc_defined (i) then do;
229                          tcm.wcte (i).flags.defined = "1"b;
230                          tcm.wcte (i).minf = fixed (wci.user_wc_min_pct (i), 7) * hundth_of_credits;
231                                                             
232                          tcm.wcte (i).credits = tcm.wcte (i).minf + tcm.telast;
233                     end;
234                     else do;
235                          tcm.wcte (i).flags.defined = "0"b;
236                          tcm.wcte (i).credits,
237                               tcm.wcte (i).minf = 0;
238                     end;
239                     tcm.wcte (i).purging = 1;
240                     tcm.wcte (i).maxel = 0;
241                     if wci.version >= 2 & wci.user_wc_defined (i) then do;
242                          if wci.realtime (i) then tcm.wcte.realtime (i) = 1;
243                          else tcm.wcte (i).realtime = 0;
244                          tcm.wcte (i).resp1 = wci.resp1 (i);
245                          tcm.wcte (i).quantum1 = wci.quantum1 (i);
246                          tcm.wcte (i).resp2 = wci.resp2 (i);
247                          tcm.wcte (i).quantum2 = wci.quantum2 (i);
248                     end;
249                     else do;                                
250                          tcm.wcte (i).resp1 = 4000000;      
251                          tcm.wcte (i).quantum1 = 500000;    
252                          tcm.wcte (i).resp2 = 32000000;     
253                          tcm.wcte (i).quantum2 = 1000000;   
254                          tcm.wcte (i).realtime = 0;
255                     end;
256                     if wci.version >= 3 & wci.user_wc_defined (i)
257                          & wci.governed (i) then do;
258                          tcm.wcte (i).flags.governed = "1"b;
259                          tcm.wcte (i).maxf = hundth_of_scatter * wci.user_wc_max_pct (i);
260                     end;
261                     else tcm.wcte (i).flags.governed = "0"b;
262                     tcm.wcte (i).flags.interactive_q = ^tcm.wcte (i).flags.governed;
263                     tcm.wcte (i).governing_credits = 0;
264                end;
265           end;
266 
267 
268 
269 
270           if wci.set_sked_mode then tcm.deadline_mode = bin (wci.deadline_mode, 1);
271           if wci.set_max_batch_elig then tcm.max_batch_elig = wci.max_batch_elig;
272 
273           if wci.set_system_wc then do;
274                tcm.wcte (0).minf = fixed (wci.system_wc_min_pct, 7)
275                     * divide (tcm.credits_per_scatter, 100, 17, 0);
276                tcm.wcte (0).credits = tcm.wcte (0).minf + tcm.telast;
277           end;
278 
279 
280 
281           if wci.set_user_wc | wci.set_system_wc then do;
282                do i = 0 to 16;
283                     tcm.wcte (i).cpu_sum,
284                          tcm.wcte (i).eligibilities = 0;
285                end;
286                tcm.define_wc_time = clock_ ();
287                tcm.processor_time_at_define_wc = tcm.processor_time;
288           end;
289 
290 DWC_UU_RETURN:
291           call UNLOCK_UNWIRE;                               
292 
293 
294 DWC_RETURN:
295           work_class_info = wci;
296           if code = 0 then
297                if (wci.error_work_class ^= 0) | (wci.error_process_id ^= ""b)
298                then code = error_table_$action_not_performed;
299           a_code = code;
300           return;
301 
302 
303 
304 
305 
306 
307 WIRE_LOCK: proc;
308 
309                call wire_proc$wire_me ();
310                call pmut$wire_and_mask (oldmask, ptwp);
311                tcmp = addr (tc_data$);
312                call pxss$lock_apt ();                       
313 
314           end WIRE_LOCK;
315 
316 
317 
318 UNLOCK_UNWIRE: proc;
319 
320                call pxss$unlock_apt ();                     
321                call pmut$unwire_unmask (oldmask, ptwp);
322                call wire_proc$unwire_me ();
323 
324           end UNLOCK_UNWIRE;
325 
326 
327      end tc;