ANN: crone - cron in Erlang (sort of)

Ulf Wiger <>
Fri Jul 5 00:34:12 CEST 2002

On Thu, 4 Jul 2002, Chris Pressey wrote:

>It raises the question: just how large can the argument to
>timer:sleep/1 be?  Scheduling a task on a monthly basis means
>sleeping for potentially hundreds of hours (that is, billions of
>milliseconds.)  How much inaccuracy should be expected to creep
>in over such a long wait?

The argument to timer:sleep/1 can be a 32 bit integer, I think.
It's the same as T in receive after T -> ok end.

A function that allows for longer sleeps than that can be found
below. If you're worried about the precision (I don't think it's
a big problem, but have not tried to figure out exactly what it
is), you can reduce ?MAX_MSG_WAIT_TIME significantly without any
measureable performance penalty.


-define(MAX_MSG_WAIT_TIME, 4294967295).         % Max int. for
                                                % unsigned 32 bit

sleep(Time) ->
    do_sleep(Time, system_time()).

do_sleep(Time, Start) ->
    DiffTime = system_time() - Start,
    case Time - DiffTime of
        X when X > ?MAX_MSG_WAIT_TIME ->
            do_sleep(Time, Start);
        X when X > 0 ->
                after X ->
        X ->

%%% return the system time in
%%% milli-seconds.

system_time() ->
    {M,S,U} = erlang:now(),
    1000000000 * M + 1000 * S + (U div 1000).

Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson Telecom AB, ATM Multiservice Networks

More information about the erlang-questions mailing list