~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Open Mash Cross Reference
mash/tcl/fca/fca-modrcvr.tcl

Component: ~ [ mash ] ~ [ apps ] ~ [ gsm ] ~ [ lib ] ~ [ otcl ] ~ [ srm ] ~ [ tcl8.3 ] ~ [ tclcl ] ~ [ tk8.3 ] ~ [ tutorials ] ~

  1 # fca-modrcvr.tcl --
  2 #
  3 #       FIXME: This file needs a description here.
  4 #
  5 # Copyright (c) 1997-2002 The Regents of the University of California.
  6 # All rights reserved.
  7 #
  8 # Redistribution and use in source and binary forms, with or without
  9 # modification, are permitted provided that the following conditions are met:
 10 #
 11 # A. Redistributions of source code must retain the above copyright notice,
 12 #    this list of conditions and the following disclaimer.
 13 # B. Redistributions in binary form must reproduce the above copyright notice,
 14 #    this list of conditions and the following disclaimer in the documentation
 15 #    and/or other materials provided with the distribution.
 16 # C. Neither the names of the copyright holders nor the names of its
 17 #    contributors may be used to endorse or promote products derived from this
 18 #    software without specific prior written permission.
 19 #
 20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
 21 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 23 # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
 24 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 25 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 26 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 27 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 28 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 29 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 30 
 31 
 32 Class FCARcvr/Tcl/Moderator -superclass FCARcvr/Tcl
 33 FCARcvr/Tcl/Moderator instproc init { mgr srcId } {
 34     $self next $mgr $srcId
 35     $self set repairRequest_ ""
 36     $self set repairReply_ ""
 37     $self set test_ 1
 38 }
 39 
 40 #--- SRM callbacks ---#
 41 FCARcvr/Tcl/Moderator instproc handle_request { fcaPkt } {
 42     $self instvar repairRequest_ mgr_
 43     DbgOut "FCARcvr/Tcl/Moderator::handle_request, modrcvr_obj($self)"
 44 
 45     set rreqState [$fcaPkt set moderatorState]
 46     if {$repairRequest_ != ""} {
 47         set myRqState [$repairRequest_ moderator_state]
 48         if {$rreqState >= $myRqState} {
 49             DbgOut "FCARcvr/Tcl/Moderator::handle_request, backoff"
 50             $repairRequest_ backoff
 51             return
 52         }
 53     }
 54     set fcd [$mgr_ fcDynamics]
 55     set myState [$fcd moderator_state]
 56     if {$myState >= $rreqState} {
 57         $self make_repair_reply $myState
 58     }
 59 }
 60 
 61 
 62 FCARcvr/Tcl/Moderator instproc make_repair_reply {state} {
 63     $self instvar repairReply_ mgr_ srcId_
 64 
 65     if {$repairReply_ != ""} {
 66         DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply a repair reply has\
 67                 already been scheduled"
 68         DbgOut "!!! repairReply_ is of class [$repairReply_ info class]"
 69         set curRpyState [$repairReply_ state]
 70         if {$curRpyState >= $state } {
 71             DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply, a repair \
 72                     only made, don't need to make the repair anymore"
 73             return
 74         }
 75         $repairReply_ cancel
 76         delete $repairReply_
 77         set repairReply_ ""
 78     }
 79     set repairReply_ [new FCARepairReply/Tcl/Moderator]
 80     set fcd [$mgr_ fcDynamics]
 81     $repairReply_ set_state [$fcd moderator_state]
 82     $repairReply_ set pktGrantUpdate [$fcd make_grant_pkt]
 83     $repairReply_ set pktQueueUpdate [$fcd make_queue_pkt]
 84     $mgr_ sched_reply $repairReply_ $srcId_
 85     DbgOut "FCARcvr/Tcl/Moderator::make_repair_reply, a repair reply is\
 86             just scheduled"
 87 }
 88 
 89 
 90 FCARcvr/Tcl/Moderator instproc handle_queue_update_repair { fcaPkt } {
 91     $self instvar mgr_
 92 
 93     set fcDynamics [$mgr_ fcDynamics]
 94     set newStateNum [$fcaPkt set moderatorState]
 95     $fcDynamics set_moderator_state $newStateNum
 96     set numUpdates [$fcaPkt set numUpdates]
 97     set pktUpdates [$fcaPkt set pktUpdates]
 98     if { $numUpdates != [llength $pktUpdates]} {
 99         DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update_repair, \
100                 numUpdates != number of grants within pktUpdates"
101     }
102 
103     # creating new admitted list
104     set newAdmittedRqs [new FCA_RequestList/Bounded [$mgr_ fcPolicy]]
105 
106     foreach i $pktUpdates {
107         set srcId [$i set srcId]
108         set requestId [$i set requestId]
109         set allRequests [[$mgr_ getRcvr $srcId] get_requests]
110         if { ![$allRequests is_canceled $requestId] } {
111             # add requests to admitted requests
112             $newAdmittedRqs add $srcId $requestId
113             $fcDynamics delete_pending_request $srcId $requestId
114             if { [$allRequests dont_have $requestId] } {
115                 DbgOut "Don't have request for $srcId:$requestId"
116 
117                 # let the rcvr know that we ought to have got this stuff
118                 $allRequests got_request $requestId {}
119 
120                 # make a repair request
121                 DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update_repair, \
122                         make repair request "
123                 set rcvr [$mgr_ getRcvr $srcId]
124                 set needSched \
125                         [$rcvr make_repair_request 0 $requestId $requestId]
126                 if {$needSched} {
127                     DbgOut "handle_queue_update_repair: \
128                             repairRequest [$rcvr repair_request]"
129                     $mgr_ sched_request [$rcvr repair_request] $srcId
130                 }
131             }
132         }
133     }
134 
135 
136     set admittedRqs [$fcDynamics admitted_requests]
137     set admittedRqList [$admittedRqs get_list]
138     # for each of the old admitted request, if not in the new admitted
139     # request list, should be removed from the final admitted list
140     foreach rq $admittedRqList {
141         set srcId [lindex $rq 0]
142         set requestId [lindex $rq 1]
143         if {![$newAdmittedRqs exists $srcId $requestId]} {
144             $fcDynamics remove_admitted_request $srcId $requestId
145         }
146     }
147 
148     # for each of the new admitted request, if not in the old admitted
149     # request list, should be added to the final admitted list
150     set newAdmittedRqList [$newAdmittedRqs get_list]
151     foreach rq $newAdmittedRqList {
152         set srcId [lindex $rq 0]
153         set requestId [lindex $rq 1]
154         if {![$admittedRqs exists $srcId $requestId]} {
155             $fcDynamics admit_request $srcId $requestId
156         }
157     }
158 
159     delete $newAdmittedRqs
160 }
161 
162 
163 FCARcvr/Tcl/Moderator instproc handle_grant_update_repair { fcaPkt } {
164     $self instvar mgr_
165 
166     set fcDynamics [$mgr_ fcDynamics]
167     set newStateNum [$fcaPkt set moderatorState]
168     $fcDynamics set_moderator_state $newStateNum
169 
170     set numUpdates [$fcaPkt set numUpdates]
171     if {$numUpdates == 0} {
172         DbgOut "FCARcvr/Tcl/Moderator::handle_grant_update_repair, \
173                 numUpdates = 0"
174         return
175     }
176     set pktUpdates [$fcaPkt set pktUpdates]
177     if { $numUpdates != [llength $pktUpdates]} {
178         DbgOut "numUpdates != number of grants within pktUpdates"
179     }
180 
181     set grantInstList ""
182 
183     foreach i $pktUpdates {
184         set grantSeqNo [$i set grantSeqno]
185         set srcId [$i set srcId]
186         set requestId [$i set requestId]
187         set floorType [$i set floorType]
188         set instance [$i set floorInstance]
189 
190         lappend grantInstList [list $floorType $instance]
191 
192         set instObj [$fcDynamics getFloorInstanceObj $floorType $instance]
193         set allRequests [[$mgr_ getRcvr $srcId] get_requests]
194         if { [$allRequests is_canceled $requestId] } {
195             # this request has already been canceled
196             not_implemented "release this grant instance"
197             return
198         }
199 
200         set request [$allRequests get $requestId]
201         $fcDynamics grant_floor $floorType $instance $srcId \
202                 $requestId $grantSeqNo
203     }
204 
205     # evacuate the other floorType and instances not mentioned in the repair
206     foreach inst $grantInstList {
207         set ftype [lindex $inst 0]
208         set instance [lindex $inst 1]
209         $fcDynamics evacuate $ftype $instance
210     }
211 }
212 
213 
214 FCARcvr/Tcl/Moderator instproc handle_reply {fcaPkt } {
215     $self instvar mgr_ repairReply_ repairRequest_
216 
217     set fcd [$mgr_ fcDynamics]
218     set myModState [$fcd moderator_state]
219     set qUpdate [$fcaPkt set pktQueueUpdate]
220     set grantUpdate [$fcaPkt set pktGrantUpdate]
221     set rrpyState [$qUpdate set moderatorState]
222 
223     if {$myModState < $rrpyState } {
224         $fcd reset
225         $self handle_queue_update $qUpdate
226         $self handle_grant_update $grantUpdate
227         # cancel repair request:
228 
229         if { $repairRequest_ != "" } {
230             set rqState [$repairRequest_ moderator_state]
231             if {$rqState <= $rrpyState} {
232                 $repairRequest_ cancel
233                 delete $repairRequest_
234                 set repairRequest_ ""
235             }
236         }
237         return
238     }
239 
240     #cancel repair reply
241     if {$repairReply_ != "" } {
242         set myRrpyState [$repairReply_ state]
243         if {$rrpyState >= $myRrpyState} {
244             DbgOut "FCARcvr/Tcl/Moderator::handle_reply, my repair reply \
245                     canceled"
246             $repairReply_ cancel
247             delete $repairReply_
248             set repairReply_ ""
249         }
250     }
251 }
252 
253 
254 FCARcvr/Tcl/Moderator instproc handle_SA {fcaPkt}  {
255     $self instvar repairRequest_ mgr_ srcId_
256     DbgOut "handle_SA::FCARcvr/Tcl/Moderator, newState = [$fcaPkt set currentState]"
257     set fcd [$mgr_ fcDynamics]
258     set myState [$fcd moderator_state]
259     set newState [$fcaPkt set currentState]
260     if { $myState >= $newState } {
261         DbgOut "myState($myState) newState($newState) \
262                 FCARcvr/Tcl/Moderator::handle_SA"
263 #       after 5000
264         return
265     }
266 #    after 1000
267     if { $repairRequest_ == "" } {
268         set repairRequest_ [new FCARepairRequest/Tcl/Moderator $newState]
269         $mgr_ sched_request $repairRequest_ $srcId_
270         DbgOut "new repairRequest newed and sent out"
271 #       after 1000
272         return
273     }
274 
275     set rqState [$repairRequest_ moderator_state]
276     if {$rqState >= $newState} {
277         DbgOut "currently requested state ($rqState) is newer than \
278                 newState ($newState)"
279         return
280     }
281     $repairRequest_ set_moderator_state $newState
282 #    after 1000
283 }
284 
285 # HERE!!
286 #FCARcvr/Tcl/Moderator instproc handle_SA {fcaPkt} {
287 #    $self instvar mgr_ srcId_ repairRequest_
288 #    set fcd [$mgr_ fcDynamics]
289 #    set myModState [$fcd moderator_state]
290 #    set newState [$fcaPkt set currentState]
291 #    DbgOut "saModState = $newState, FCARcvr/Tcl/Moderator::handle_SA,"
292 #    DbgOut "FCARcvr/Tcl/Moderator::handle_SA, repairRequest = $repairRequest_"
293 #    if { $myModState >= $newState } {
294 #       DbgOut "FCARcvr/Tcl/Moderator::handle_SA, \
295 #               myModState ($myModState) >= newState ($newState)"
296 #       return
297 #    }
298 #    if { $repairRequest_ != "" } {
299 #       DbgOut "repairRequest is not empty"
300 #       DbgOut "of class [$repairRequest_ info class]"
301 ##      DbgOut "moderatorState = [$repairRequest_ set moderatorState]"
302 #    } else {
303 #       DbgOut "repairRequest is empty"
304 #    }
305 ## if { [info exist [$RepairRequest_ set moderatorState] } {
306 #    if { $repairRequest_ == "" } {
307 #       DbgOut "RepairRequest is empty"
308 #       set needSched 1
309 #       set repairRequest_ [new FCARepairRequest/Tcl/Moderator $newState]
310 #       $mgr_ sched_request $repairRequest_ $srcId_
311 #       DbgOut "Repair request ($repairRequest_) sent out"
312 #    } else {
313 #       if { $newState > [$repairRequest_ moderator_state] } {
314 #           $repairRequest_ set_moderator_state $newState
315 #           DbgOut "Repair request has new state $newState"
316 #       }
317 #    }
318 #}
319 
320 
321 
322 
323 FCARcvr/Tcl/Moderator instproc recv { fcaPkt } {
324     set pktType [$fcaPkt set pktType]
325     switch $pktType {
326         "PKT_FLOOR_REQUEST" {
327             $self handle_floor_request $fcaPkt
328         }
329         "PKT_FLOOR_CANCEL" {
330             $self handle_floor_cancel $fcaPkt
331         }
332         "PKT_GRANT_UPDATE" {
333             $self handle_grant_update $fcaPkt
334         }
335         "PKT_QUEUE_UPDATE" {
336             $self handle_queue_update $fcaPkt
337         }
338         "PKT_CANCEL_UPDATE" {
339             $self handle_cancel_update $fcaPkt
340         }
341         default {
342             DbgOut ""should not receive $pktType here!"
343         }
344     }
345 }
346 
347 
348 # assume single moderator now -> local receiver is not a moderator
349 # for multiple moderators, check whether local receiver is moderator,
350 # then send out update messages
351 FCARcvr/Tcl/Moderator instproc handle_grant_update {fcaPkt} {
352     $self instvar mgr_
353 
354     ###!!! testing handle_sa
355     DbgOut "modrcvr ignore grant update [$fcaPkt set moderatorState]"
356     return
357 
358 
359     set fcDynamics [$mgr_ fcDynamics]
360     set curStateNum [$fcDynamics moderator_state]
361     set newStateNum [$fcaPkt set moderatorState]
362     if { $newStateNum != [expr $curStateNum+1] } {
363         DbgOut "invalid moderator update received; ignoring it"
364         return
365     }
366 
367     $fcDynamics set_moderator_state $newStateNum
368     set numUpdates [$fcaPkt set numUpdates]
369     set pktUpdates [$fcaPkt set pktUpdates]
370     if { $numUpdates != [llength $pktUpdates]} {
371         DbgOut "numUpdates != number of grants within pktUpdates"
372     }
373 
374     if { [$fcaPkt set pktType]=="PKT_GRANT_UPDATE" } {
375         set isGrant 1
376     } else {
377         set isGrant 0
378     }
379 
380     foreach i $pktUpdates {
381         set grantSeqNo [$i set grantSeqno]
382         set srcId [$i set srcId]
383         set requestId [$i set requestId]
384         set floorType [$i set floorType]
385         set instance [$i set floorInstance]
386 
387         if { ![$fcDynamics gr_is_stale $floorType $instance $grantSeqNo] } {
388             # if not stale grant/release
389 
390             set instObj [$fcDynamics getFloorInstanceObj $floorType $instance]
391             set allRequests [[$mgr_ getRcvr $srcId] get_requests]
392             if { [$allRequests is_canceled $requestId] } {
393                 # this request has already been canceled
394                 not_implemented "release this grant instance"
395                 return
396             }
397 
398             set request [$allRequests get $requestId]
399             if {$isGrant} {
400                 $fcDynamics grant_floor $floorType $instance $srcId \
401                         $requestId $grantSeqNo
402             } else {
403                 not_implemented "release"
404                 $fcDynamics releaseHolder $floorType $instance $grantSeqNo
405                 # update UI
406                 [$mgr_ set uiMgr_] release_received $floorType $instObj
407             }
408         }
409     }
410 }
411 
412 
413 
414 FCARcvr/Tcl/Moderator instproc handle_queue_update {fcaPkt} {
415     $self instvar mgr_ test_
416 
417     ###!!! testing handle_sa
418     if {$test_} {
419         set test_ 0
420         DbgOut "FCARcvr/Tcl/Moderator, ignore queue update, testing mod handle_sa"
421         return
422     }
423 
424 
425     set fcDynamics [$mgr_ fcDynamics]
426     set curStateNum [$fcDynamics moderator_state]
427     set newStateNum [$fcaPkt set moderatorState]
428     if { $newStateNum <= $curStateNum } {
429         DbgOut "current state is more recent than new state, dump queue update"
430         return
431     }
432 
433     set numUpdates [$fcaPkt set numUpdates]
434     set pktUpdates [$fcaPkt set pktUpdates]
435 
436     $fcDynamics set_moderator_state $newStateNum
437 
438     foreach i $pktUpdates {
439         set isAdd [$i set isAdd]
440         set srcId [$i set srcId]
441         set requestId [$i set requestId]
442 
443         if {$isAdd} {
444             set allRequests [[$mgr_ getRcvr $srcId] get_requests]
445 
446             if { ![$allRequests is_canceled $requestId] } {
447                 # add requests to admitted requests
448                 $fcDynamics admit_request $srcId $requestId
449                 $fcDynamics delete_pending_request $srcId $requestId
450 
451                 if { [$allRequests dont_have $requestId] } {
452                     DbgOut "Don't have request for $srcId:$requestId"
453 
454                     # let the rcvr know that we ought to have got this stuff
455                     $allRequests got_request $requestId {}
456 
457                     # make a repair request
458                     DbgOut "FCARcvr/Tcl/Moderator::handle_queue_update, \
459                             make repair request "
460                     set rcvr [$mgr_ getRcvr $srcId]
461                     set needSched \
462                             [$rcvr make_repair_request 0 $requestId $requestId]
463                     if {$needSched} {
464                         DbgOut "handle_queue_update: \
465                                 repairRequest [$rcvr repair_request]"
466                         $mgr_ sched_request [$rcvr repair_request] $srcId
467                     }
468 
469                 }
470             }
471         } else {
472             $fcDynamics remove_admitted_request $srcId $requestId
473             # if there is a cancel message for this request, obsolete it out
474             [$mgr_ getRcvr $srcId] obsolete_important cancel $requestId
475         }
476     }
477 }
478 
479 
480 
481 # whether at srcId there is a release for grantSeq
482 FCARcvr/Tcl/Moderator instproc isPendingRls {srcId grantSeq} {
483     $self instvar mgr_ pendingRls_
484     set rcvr [$mgr_ getRcvr $srcId]
485     return [info exist pendingRls_($grantSeq)]
486 }
487 
488 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.