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.

/Uffe

-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 ->
            sleep(?MAX_MSG_WAIT_TIME),
            do_sleep(Time, Start);
        X when X > 0 ->
            receive
                after X ->
                        ok
                end;
        X ->
            ok
    end.


%%%
%%% 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