comp.lang.ada
 help / color / mirror / Atom feed
From: "David C. Hoos" <david.c.hoos.sr@ada95.com>
To: "comp.lang.ada mail to news gateway" <comp.lang.ada@ada.eu.org>
Cc: simon_the_softy@hotmail.com
Subject: Re: Elegant 'abort' of sleeping task
Date: Mon, 31 Mar 2003 10:49:26 -0600
Date: 2003-03-31T10:49:26-06:00	[thread overview]
Message-ID: <mailman.32.1049141728.20696.comp.lang.ada@ada.eu.org> (raw)
In-Reply-To: 310b040f.0303310518.76dc9bf7@posting.google.com

Hi Simon,

I have a timer package that does what I believe you need.  I do not have
access to the code at the moment, but later today I will get it and post it
on my FTP site.

Basically, the package declares an abstract data type Timers, which
has a discriminant specifying the maximum number of timeouts that
can be simultaneously managed.

Operations are provided for Setting and Clearing of timers.

Individual timer members of the object are identified by a positive
integer.

Timers can be set either at a specified time from now, or at an absolute
time.

Internally, the object contains a time-ordered array of the timers' absolute
expiration time, an access to the callback procedure to be called on
expiration, and identification.

When one of the operations is called, a persistent signal is sent to
the timer manager task which aborts the current delay until statement,
using asynchronous transfer of control.

This the permits the ordered array to be manipulated as required by the
operation, followed by the initiation of a new delay until statement for
the earliest expiration time in the list.

Upon timer expiration, a "callback" procedure is called, with the timer
identification as its only parameter.

The Set operation has a parameter to specify which Action procedure
(callback) is to be called upon timer expiration.

This package has been in heavy use since 1997.

----- Original Message -----
From: "Simon Apperley" <simon_the_softy@hotmail.com>
Newsgroups: comp.lang.ada
To: <comp.lang.ada@ada.eu.org>
Sent: Monday, March 31, 2003 7:18 AM
Subject: Elegant 'abort' of sleeping task


> Hi,
>
> I'm looking at the design of a piece of server code which has to
> handle calls that also pass a timeout value. The target system is
> aerospace related, and dynamically creating tasks 'on the fly' just is
> not an option.
>
> I want to be able to set up a single task to handle the timeout from
> the head of a delta-queue of timeouts, but have found a problem. If I
> have the timeout implemented as a task stuck in a 'delay' call, and a
> more immediate timeout comes in, I want to wake up the sleeping task,
> re-calculate the delta-queue and then sleep on the new, shorter,
> delay. So far the only way I can see to do this is to use abort, and
> set up the task again, which seems a bit of a brute force approach.
>
> Has anyone got any suggestions on how I can interrupt the sleep call,
> without using a polling approach that would just consume CPU time at
> the expense of the other code in the system.
>
> I could use direct calls to the underlying RTOS, but I'd rather keep
> as much as possible within the Ada language.
>
> I did wonder about delay until TIME, and having another task change
> TIME, but that seems rather un-safe to me as it starts making
> assumptions about the underlying run-time implementation.
>
> Thanks
>
> Simon Apperley @ General Dynamics UK COM
> _______________________________________________
> comp.lang.ada mailing list
> comp.lang.ada@ada.eu.org
> http://ada.eu.org/mailman/listinfo/comp.lang.ada
>




  parent reply	other threads:[~2003-03-31 16:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-03-31 13:18 Elegant 'abort' of sleeping task Simon Apperley
2003-03-31 13:28 ` Lutz Donnerhacke
2003-03-31 16:04 ` Jeffrey Carter
2003-04-01 12:02   ` Dmitry A. Kazakov
2003-03-31 16:49 ` David C. Hoos [this message]
2003-04-01 16:20 ` David C. Hoos
2003-04-01 16:26 ` Nick Roberts
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox