[Click] How to implement a Timeout?

David Fusté f2308030 at est.fib.upc.edu
Sat May 21 09:21:06 EDT 2005


Bart,
do you say use one Timer for each entry and use only one static 
expire_timeout function for handle expirations of all timeouts, 
differentiating them by the second parameter of the Timer constructor? 
This is a perfect solution!
I thought with this implementation but I discarded it because I didn't 
realize that the Timer constructor had a paramater to distinguish what 
timeout has expired.
thank you very much!

Bart Braem wrote:

>>I have thought in implementing a new class FT. Next, a new class
>>FTEntry, and this last class will contain a Timer variable and a
>>expire_timer function. So, each entry of the FT will have its own
>>timeout and when a new ARPEntry is created, a new Timeout will be created.
>>But, when a timeout of an entry expires, it has to delete the entry, so,
>>delete itself!
>>
>>What is the best solution to implement this type of timeout? Any other
>>idea?
>>    
>>
>
>Here's how I handle those situations in my routing table implementation:
>I have a map containing routing entries as structs. Each struct has at least 
>some unique identifier (in my case IP adresses), a pointer to the current 
>element and a Timer. I then initialise that timer with a static callback 
>function in the element and a specific timeout. When the timer expires the 
>callback function is called, it searches the right element and there it does 
>what needs to be done. If deletion is necessary I can delete the map entries.
>Some example code:
>
>in the element header file:
>
>struct routing_table_entry{
>	...
>	Timer* expiry;
>};
>
>typedef HashMap<IPAddress, routing_table_entry> RouteMap;
>
>private:
>	struct TimerData{
>		ThisElement* me;
>		IPAddress * ip;
>	};
>
>	static void handleExpiry(Timer*, void *); // calback function for timers
>	void expire(const IPAddress &, TimerData *);
>	RouteMap routes,
>
>In the cc file:
>
>void ThisElement::insertRoutetableEntry(... const IPAddress & ip){
>	struct routing_table_entry data;
>	// initialise data
>	...
>
>	TimerData* timerdata = new TimerData();
>	timerdata->ip = new IPAddress(ip);
>	timerdata->me = this;
>	data.expiry = new Timer(&ThisElement::handleExpiry,timerdata);
>	data.expiry->initialize(this);
>	data.expiry->schedule_after_ms(...);
>	
>	routes.insert(ip,data);
>}
>void ThisElement::handleExpiry(Timer*, void * data){
>	TimerData * timerdata = (TimerData*) data;
>	assert(timerdata);
>	timerdata->me->expire(*timerdata->ip,timerdata);
>}
>
>void ThisElement::expire(const IPAddress & ip, TimerData * timerdata){
>	// pass timerdata too to clean up memory after timer expires completely
>	RouteMap::Pair* pair = routes.find_pair(ip);
>	assert(pair);
>	if(pair->...){ // need to reschedule
>		pair->value.expiry->schedule_after_ms(AODV_DELETE_PERIOD);
>	} else { // delete
>		delete(pair->value.expiry);
>		routes.remove(ip);
>		delete timerdata->ip;
>		delete timerdata;
>	}
>}
>
>If you want more information feel free to contact me.
>
>Bart
>_______________________________________________
>click mailing list
>click at amsterdam.lcs.mit.edu
>https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>  
>


More information about the click mailing list