[Ace-users] [ace-users] When an Ace_Reactor calls handle_timeout() on an Ace_Event_Handler, is it possible to, within the handle_timeout() call, get at the timer_id that is associated with that particular invocation?

Douglas C. Schmidt schmidt at dre.vanderbilt.edu
Fri Feb 8 21:17:07 CST 2008


Hi Marc,

> I can't believe I didn't think of that!  Thanks so much.

You're quite welcome!  I've run into this myself in the past, so I knew
the trick ;-)

Doug

> 
> On Feb 8, 2008 8:19 AM, Douglas C. Schmidt <schmidt at dre.vanderbilt.edu> wrote:
> 
>     Hi Marc,
>    
>       Thanks for using the PRF.
>    
>     >    ACE VERSION: 5.6.2
>     >
>     >    HOST MACHINE and OPERATING SYSTEM:
>     >        Not Available at the moment (sorry)/Red Hat 4
>     >
>     >    TARGET MACHINE and OPERATING SYSTEM, if different from HOST:
>     >    COMPILER NAME AND VERSION (AND PATCHLEVEL): Not Available at the moment
>     >(sorry)
>     >
>     >    THE $ACE_ROOT/ace/config.h FILE: Not Available at the moment (sorry)
>     >
>     >    THE $ACE_ROOT/include/makeinclude/platform_macros.GNU FILE: Not
>     >Available at the moment (sorry)
>     >
>     >    CONTENTS OF $ACE_ROOT/bin/MakeProjectCreator/config/default.features
>     >    (used by MPC when you generate your own makefiles): Not Available at the
>     >moment (sorry)
>     >
>     >    AREA/CLASS/EXAMPLE AFFECTED:
>     >        Ace_Reactor/Ace_Event_Handler.  Nothing failed to compile, just
>     >trying to figure out how to do something.
>     >    DOES THE PROBLEM AFFECT:
>     >        COMPILATION? No.
>     >        LINKING?
>     >        EXECUTION?  Yes.
>     >        OTHER (please specify)?
>     >
>     >    SYNOPSIS:
>     >        I'm trying to get access to the timer_id value created when a
>     >schedule_timer() method is called
>     >from within the handle_timeout() call that results, but can't figure out
>     >how.
>    
>     The best way to do this is to use the Asynchronous Completion Token
>     pattern (see POSA2 www.cs.wustl.edu/~schmidt/POSA/POSA2) that's
>     implemented with the ACE timer queues and the handle_timeout()
>     method.  Here's some pseudo-code:
>    
>     class My_Event_Handler : public ACE_Event_Handler
>     {
>      virtual int handle_timeout (const ACE_Time_Value &,
>                                  const void *act);
>    
>     // ...
>     };
>    
>     My_Event_Handler eh = new My_Event_Handler;
>     const void *timer_act = new long;
>    
>     long timer_id = timer_queue->schedule (eh, timer_act, ....);
>     *timer_act = timer_id;
>     ...
>    
>     Now, when My_Event_Handler::handle_timeout() is called back you can
>     get the timer_id as follows:
>    
>     int My_Event_Handler::handle_timeout (const ACE_Time_Value &,
>                                          const void *act)
>     {
>      long timer_id = *static_cast <long *> (act);
>      // .. Do something with timer_id
>      delete act;
>     }
>    
>     Naturally, you'll need to fix any typos in my pseudo-code ;-)
>    
>     Take care,
>    
>         Doug
>    
>     >    DESCRIPTION:
>     >        Hi all, ACE newbie here.  Sorry if this has been discussed, I
>     >searched and couldn't find anything.  Basically,
>     >what I have is a message passing program that wants to read messages from an
>     >input socket and send them out an output socket.
>     >The only tricky part is that I want to either delay (for a set amount of
>     >time), or pause entirely, the sending of certain types of messages.
>     >My design was to have a first reactor that reads the input socket, checks
>     >the incoming messages, and passes them on to a second
>     >reactor via the schedule_timer() method.  If the messages are to be sent
>     >immediately, I send it with a zero timeout value.  If they are to
>     >be delayed, I send them with the appropriate delay value.  The message
>     >content is passed within the act argument of the call, ensuring
>     >the appropriate message is associated with the appropriate event.
>     >
>     >The problem I have is that I also want to be able to change the delays of
>     >certain messages on the fly.  That means if messages of type 1
>     >are to be delayed for 1 minute, but during that second the user decides to
>     >change the delay to 5 seconds, I need to update the delay on
>     >the existing timer events that have already been sent for that message type.
>     >My solution was this was to manually maintain the set of timer_id
>     >values that result from the schedule_timer() call, and upon a request for a
>     >change just call the reschedule method for active timer_id values
>     >associated with that message type.  However, I need a way to then remove
>     >timer_id values from this manually maintained set, and that's
>     >where my question comes in.  Is there a way to get at the timer_id
>     >associated with a particular handle_timeout() call, from within the
>     >handle_timeout() call itself (or even the add_/remove_reference() calls)?
>     >
>     >I'm a little surprised that I haven't yet found an easy way to do this
>     >because intuitively, if we are given access to the timer_id values and
>     >methods to manipulate their events, a relatively common approach would be to
>     >save them into some sort of pool, process them when needed,
>     >and then remove them from the pool when handle_timeout() is called and they
>     >are no longer needed.  I'm guessing that I'm just not seeing
>     >the set of calls I would need to do to do this.
>     >
>     >Any help anyone could offer would be much appreciated, including alternative
>     >designs (which I already have, I just like mine better, so
>     >I'm trying to find a way to make it work).
>     >
>     >Thanks,
>     >Marc Novakouski
>     >
>     >
> 
>     --
>     Dr. Douglas C. Schmidt                       Professor and Associate Chair
>     Electrical Engineering and Computer Science  TEL: (615) 343-8197
>     Vanderbilt University                        WEB: www.dre.vanderbilt.edu/~schmidt
>     Nashville, TN 37203                          NET: d.schmidt at vanderbilt.edu
> 



More information about the Ace-users mailing list