i am a newbie to glib, but have started
using glib heavily in my latest manet networking project to implement reliable
packet transfer over intermittent links.
one of the issues i have run into with glib
timer events is that there does not seem to be asynchronous event cancellation
support. that is, i would like to be able to cancel a running timer following
the reception of an event on a file descriptor (in my concrete example, the
arrival of an ack packet will make a udp socket fd readable, following which i
would want to free associated memory and cancel the timer whose callback
function operates on the data to be freed). currently, i work around the lacking
async timer cancellation feature by not freeing the memory upon the udp socket
fd becoming readable, letting the timer run to its completion, then
checking for a flag within the timer's callback function to see if the memory
can be freed, and if so, return FALSE from the callback function to cancel the
timer.
here is my problem with synchronous
cancellation: the way the transfer service over intermittent links works is that
it needs to create a timer for each packet to be transferred (the code in theh
timer callback is designed to check whether the packet needs to be
retransmitted in case no ack packet has been received). under heavy load,
the number of timers added via g_timeout_add() grows very quickly, and i even
see some strange behavior where timer callbacks are occasionally
called after the associated timer has been cancelled via return
FALSE).
now, to circumvent the duplicate timer
callback issue, and also simplify my own code in order to avoid having to wait
for a timer (or a set of timers as in my case) to expire before i can free a
block of memory, i would prefer a way for me to cancel timers asynchronously
(i.e. before they expire).
my question hence is: is there a glib API
call that i may have missed/is undocumented, or is there some other way of
creating timers in glib that can be cancelled asynchronously?
thanks!
Josef
|