[fpc-pascal] Solution for Timer in daemon

Ludo Brands ludo.brands at free.fr
Sat Mar 2 10:34:47 CET 2013


On 03/01/2013 07:10 PM, Krzysztof wrote:
> Hi,
> 
> I'm reading that I can't use timer in daemon because daemon core is
> based on thread. 

daemonapp is using threads but nothing stops you from daemonizing your
app yourself with a simple fork.


> So I'm trying to create another thread which simulate
> timer. My interval is quite big (~1-5 minutes), so I can't just use
> sleep(60000) because daemon will hung on terminate. So I have two ideas:
> 
> 1. Create loop with short sleep(1000) which on each loop check if main
> interval occur and check if daemon is terminated
> 2. Create loop with RTL event with RtlEventWaitFor(Event, 60000) and
> daemon on terminate just send event to worker so it immediately exit.
> 
> What is the best efficient solution? Maybe exists another way?
> 

Very difficult to give an absolute answer without knowing what the
daemon is doing.

On unix, an alternate solution is to use fpSelect (Function
fpSelect(N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cint;
 ) and specify a time-out value. You can specify a signal with exceptfds
or a file descriptor with readfds/writefds that will trigger the return
of select. I have written a few daemons that are stopped by sending them
a signal. fpSelect is then a natural solution. If your daemon is already
receiving control data from the outside through sockets, FIFO's or
whatever file, simply attach the select to the file descriptor of that
channel.

Note that the time precision of loops using sleep is not good at all.
Use fptime to decide when to trigger the task. If a precision higher
than 1000ms is needed, nothing stops you from modulating the sleep time
based on fptime so that the last sleep expires at the time wanted.

So the best solution really depends on what else you are doing in the
daemon.

Ludo



More information about the fpc-pascal mailing list