[erlang-questions] erlang:restart_timer

Loïc Hoguin essen@REDACTED
Wed Nov 5 14:59:51 CET 2014


> I propose a new BIF:
>
> 	erlang:restart_timer(Ref, Time) -> false | RemainingTime

This is definitely something that could see use in a few places inside 
Cowboy.

> This will restart a time if it is active and return the time that remained when it was restarted.
> If restart_timer return false either the timer has already time out or the reference is not a timer.

In some cases a "start_or_restart_timer" scenario could also be useful. 
Otherwise I'm stuck having to check the return value and having to call 
start_timer as before, making it not as useful as it could be. For 
example if I have a timeout to close the socket if no data is received, 
and I have both data and the timeout in my mailbox, I don't really want 
to process the data and then immediately close the connection. There's 
data, so the connection is still up, so I want to restart the timer even 
if it already expired.

> The benefit is a speedup with at least 2.5 times. comparing:
>
> 	erlang:restart_timer(Ref, Time)
> vs
> 	erlang:cancel_timer(Ref)
> 	Ref1 = erlang:start_timer(Time, self(), Message)
>
> The cost saving is that restart_timer preserve already stored messages. And also internal timer structures are
> preserved. Resulting in less overhead.
>
> The interface is simple and do not require a new reference every restart, this could also save the time
> and heap updating a server state.

That part sounds good.

-- 
Loïc Hoguin
http://ninenines.eu



More information about the erlang-questions mailing list