From: Jeffrey Carter <spam@spam.com>
Subject: Re: Elegant 'abort' of sleeping task
Date: Mon, 31 Mar 2003 16:04:58 GMT
Date: 2003-03-31T16:04:58+00:00 [thread overview]
Message-ID: <3E886786.9050702@spam.com> (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.
>
> 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.
It sounds as if you have something like
loop
-- get Timeout
delay Timeout;
-- post timeout processing
end loop;
in which case you might be able to do something like
loop
-- get Timeout
loop
select
accept New_Timeout;
-- get Timeout;
or
delay Timeout;
-- post timeout processing
exit;
end select;
end loop;
end loop;
This is a timed select, but it has the effect you desire. If nothing
happens during the timeout period, the task is delayed for that period
and then the post timeout processing occurs. Then it gets the next
timeout period. If a new timeout value becomes available during a
timeout, you make a call to the New_Timeout entry, which immediately
results in the task obtaining a new value for Timeout and performing the
timed select again with the new value.
> 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.
All delays are defined in terms of delay until, so you can certainly use
delay until in this construct, and it will probably simplify your code.
But what you're talking about won't work. Changing the variable after
the delay until has commenced doesn't change the time at which the delay
expires. One way to consider this is that the delay until effectively
stores the current value of your variable. Ada does a lot of this kind
of thing; for example
I : Integer := 5;
begin
for J in 1 .. I loop
I := 10;
loops 5 times. Changing the value of I doesn't change the loop bounds.
--
Jeff Carter
"If a sperm is wasted, God gets quite irate."
Monty Python's the Meaning of Life
next prev parent reply other threads:[~2003-03-31 16:04 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 [this message]
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