[erlang-questions] Newbie question: wait until an absolute time

Ulf Wiger (TN/EAB) ulf.wiger@REDACTED
Fri Feb 1 16:04:26 CET 2008

Alpár Jüttner skrev:
> Dear all,
> Is there any simple way in erlang to wait until a certain absolute time
> or to do something at a specific time in the future ? Namely, I'm
> looking for the absolute counterpart of the functions sleep(),
> send_after(), apply_after() and the 'after TimeOut ->'.
> Is it there anything like the opposite of  now_to_universal_time(Now)?
> Anyway, is there any easy way to use a larger timeout than it is
> representable by a single integer?

As has been noted already, you cannot use timeout values that are larger 
than a smallint. A way to do it is to split the timeout into shorter 
waits, and then calculate the next timeout. Whether you want to wait in 
five-minute intervals or several hours at a time, is pretty much up to 
you. There are pros and cons with each. If the system idles a lot, you 
might not want to trigger activity unnecessarily; if it practically 
never idles, you might priorities readiness to handle things like 
unexpected jumps in the system time (when some operator changes the
clock 8 hours back or forth in a running system...)

A reasonably efficient diff between now() timestamps can look like this:

diff({M,S,U}, {M,S1,U1}) ->
     ((S-S1) * 1000) + ((U-U1) div 1000);
diff({M,S,U}, {M1,S1,U1}) ->
     ((M-M1)*1000000+(S-S1))*1000 + ((U-U1) div 1000).

The main trick is to avoid creating bignums. At least this used to be 
quicker, when I benchmarked it years ago. That pesky erlang team tends 
to change things in ways that sometimes invalidates old assumptions,
though. (:

Ulf W

More information about the erlang-questions mailing list