comp.lang.ada
 help / color / mirror / Atom feed
From: Natasha Kerensikova <lithiumcat@instinctive.eu>
Subject: Re: Termination of periodic tasks
Date: Tue, 17 Jun 2014 06:57:38 +0000 (UTC)
Date: 2014-06-17T06:57:38+00:00	[thread overview]
Message-ID: <slrnlpvpmv.i0l.lithiumcat@nat.rebma.instinctive.eu> (raw)
In-Reply-To: lnn8bb$i9s$1@dont-email.me

Hello,

On 2014-06-16, Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org> wrote:
> ARM 9.3 says, "If the task is created by the evaluation of an allocator for a 
> given access type, it depends on each master that includes the elaboration of 
> the declaration of the ultimate ancestor of the given access type."
>
> The master of a task designated by a Task_Access is the environment task, 
> assuming To_Be_Discussed to be a library unit. Meanwhile, finalization of an 
> object of type Watcher will happen when you exit the scope of whatever unit 
> declares the object. Those will usually be different if the object is declared 
> outside of To_Be_Discussed. I'm not clear about the case where the object is 
> declared inside To_Be_Discussed.

So let's consider instead real code that actually (more or less) works:
https://github.com/faelys/natools/blob/trunk/src/natools-cron.ads
https://github.com/faelys/natools/blob/trunk/src/natools-cron.adb
(I whipped it together yesterday after thinking about Dmitry's
suggestion, but it's still only a rough draft, there are issues to iron
out before using it for real, like handling map key collisions. However
all comments are still welcome.)

Global_Worker here is either null or an access to a Worker created by an
allocator. Since as far as I can tell Natools.Cron is library-level, the
master of the worker task is the environment task.

In this implementation, the task terminates by reaching the end of its
body whenever the protected map becomes empty.

Storage is released only right before requested again when the protected
become non-empty again, so at program termination the task memory is
"leaked", but program termination is supposed to reclaim everything
anyway.

The finalization of a Cron_Entry removes the corresponding element from
the protected map, so the worker task terminates after all Cron_Entry
are finalized (or Reset to an empty state).

This leaves the problem of Cron_Entry objects declared in library level
packages:

   with Natools.Cron;

   package Test_Periodic is
      type Periodic_Action is new Natools.Cron.Callback with null record;

      overriding procedure Run (Self : in out Periodic_Action);

      Global_Entry : Natools.Cron.Cron_Entry;
   end Test_Periodic;

   with Ada.Text_IO;

   package body Test_Periodic is
      overriding procedure Run (Self : in out Periodic_Action) is
      begin
         Ada.Text_IO.Put_Line ("Hello");
      end Run;

   begin
      Global_Entry.Set (1.0, Periodic_Actoin'(null record));
   end Test_Periodic;

Now the master of Global_Entry is also the environment task. So
Global_Entry will not be finalized before the worker task terminates,
but by design the worker task will not terminate before Global_Entry is
finalized or Reset.

So unless at some point Global_Entry.Reset is called, this package will
cause the program to never terminate.

Is there a way to work around such a situation? Or should I just
document this as a caveat (among many others, as you can see at the
beginning of the spec)?


Thanks for your help,
Natasha

  reply	other threads:[~2014-06-17  6:57 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-15 10:10 Termination of periodic tasks Natasha Kerensikova
2014-06-15 12:11 ` Dmitry A. Kazakov
2014-06-15 15:23 ` J-P. Rosen
2014-06-16 13:54   ` Natasha Kerensikova
2014-06-17 20:14     ` Charles H. Sampson
2014-06-18  7:32       ` Dmitry A. Kazakov
2014-06-15 16:54 ` Jeffrey Carter
2014-06-16 14:02   ` Natasha Kerensikova
2014-06-16 15:08     ` Dmitry A. Kazakov
2014-06-16 17:08     ` Jeffrey Carter
2014-06-17  6:57       ` Natasha Kerensikova [this message]
2014-06-17  7:37         ` Dmitry A. Kazakov
2014-06-17  7:47           ` Natasha Kerensikova
2014-06-17  8:45             ` Dmitry A. Kazakov
2014-06-17  9:00               ` Natasha Kerensikova
2014-06-17 12:55                 ` Dmitry A. Kazakov
2014-06-17 14:51                   ` J-P. Rosen
2014-06-17 16:44                     ` Dmitry A. Kazakov
2014-06-17 20:00                       ` Randy Brukardt
2014-06-17 20:16                         ` Jeffrey Carter
2014-06-17 21:30                         ` Simon Wright
2014-06-17 12:02         ` Jacob Sparre Andersen
2014-06-17 19:32           ` Natasha Kerensikova
2014-06-17 17:53         ` Jeffrey Carter
2014-06-17 20:03           ` Randy Brukardt
replies disabled

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