comp.lang.ada
 help / color / mirror / Atom feed
From: Lutz Donnerhacke <lutz@iks-jena.de>
Subject: Re: Elegant 'abort' of sleeping task
Date: Mon, 31 Mar 2003 13:28:33 +0000 (UTC)
Date: 2003-03-31T13:28:33+00:00	[thread overview]
Message-ID: <slrnb8ggjt.ob.lutz@taranis.iks-jena.de> (raw)
In-Reply-To: 310b040f.0303310518.76dc9bf7@posting.google.com

* Simon Apperley wrote:
> 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.

If you are not hiding your own process details, you can pass the timeout
value down to the lowest level routines. Running on an approbriate OS, all
syscalls has a separate timeout parameter, therefore you are done. ;-)

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

Do not use delay: Use the syscall to sleep a specified amount of time or
shorter if an event occur. In Posix enviroments, select(2) or poll(2) comes
to mind. But if possible look for calls like epoll(2).

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

Depends on your system. Most can do this easily.

> I could use direct calls to the underlying RTOS, but I'd rather keep
> as much as possible within the Ada language.

Write a wrapper "procedure Pause_Max (seconds : in out Delay_T; events : out
Event_Array; last_event : out Natural)" or "function Pause_Max (seconds :
Delay_T) return event_or_remaining_time_t".

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

This will not work, because it will not stop in the case of events.



  reply	other threads:[~2003-03-31 13:28 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 [this message]
2003-03-31 16:04 ` Jeffrey Carter
2003-04-01 12:02   ` Dmitry A. Kazakov
2003-03-31 16:49 ` David C. Hoos
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