• Leigh B. Stoller's avatar
    This started out as a simple little hack to add a StopRun "ns" event, but · cbdc4178
    Leigh B. Stoller authored
    it got more complicated as it progressed.
    The bulk of the change was changing template_exprun so that it can take a
    pid/eid as an alternative to eid/guid. This is a big convenience since its
    easy to find the template from a running experiment, and it makes it
    possible to invoke from the event scheduler, which has never heard of a
    template before (and its not something I wanted to teach it about).  Its
    also easier on users.
    Anyway, back to the stoprun event. You can now do this:
    	$ns at 100 "$ns stoprun"
    	tevc -e pid/eid now ns stoprun
    You can add the -w option to wait for the completion event that is sent,
    but this brings me to the glaring problems with this whole thing.
    * First, the scheduler has to fire off the stoprun in the background,
      since if it waits, we get deadlock. Why? Cause the implementation of
      stoprun uses the event system (SNAPSHOT event, other things), and if
      the scheduler is sitting and waiting, nothing happens.
      Okay, the solution to this was to generate a COMPLETION event from
      template_exprun once the stop operation is complete. This brings me
      to the second problem ...
    * Worse, is that the "ns" events that are sent to implement stoprun (like
      snapshot) send their own completion events, and that confuses anyone
      waiting on the original stoprun event (it returns early).
      So what to do about this? There is a "token" field in the completion
      event structure, which I presume is to allow you to match things up.  But
      there is no way to set this token using tevc (and then wait for it), and
      besides, the event scheduler makes them up anyway and sticks them into
      the event. So, the seed of a fix are already germinating in my mind, but
      I wanted to get this commit in so that Mike would have fun reading this
      commit log.