comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Delayed deallocation of non-terminated task in Gnat?
Date: Tue, 30 Aug 2011 18:42:34 +0200
Date: 2011-08-30T18:42:34+02:00	[thread overview]
Message-ID: <1xl6w0ulw1tie$.nf21cvtst5tv.dlg@40tude.net> (raw)
In-Reply-To: d46346a2-ad00-4f10-8362-9d098e21abb4@h23g2000pra.googlegroups.com

On Tue, 30 Aug 2011 08:38:52 -0700 (PDT), Adam Beneschan wrote:

>  I'm having a bit of difficulty figuring out from
> the RM what the exact semantics of finalizing an unterminated task
> object are, but I'm pretty sure that aborting the task is not one of
> them.  (Note that this applies only to tasks without discriminants.
> If the task has discriminants, freeing it is an
> error---13.11.2(11ff).)

What is the difference? Is it an attempt to have freed tasks running
further? Or an attempt to construct a race condition, e.g. when the task
being freed has an open terminate alternative or else has been accepted a
rendezvous and now is going down? 

Considering this standard pattern:

type Object;
task type Worker (Self : not null access Object'Class) is
   entry Shut_Down;
end Worker;
type Worker_Ptr is access Worker;
type Object is new Ada.Finalization.Limited_Controlled with record
   Worker : Worker_Ptr;
end Object;
overriding procedure Finalize (This : in out Object);

Now the following is a race with a bounded error:

procedure Finalize (This : in out Object) is
   procedure Free is new Ada.Unchecked_Deallocation (...);
begin
   if This.Worker /= null then
      This.Worker.Shut_Down;
      Free (This.Worker);
   end if;
end Finalize;

which shall be rewritten as:

procedure Finalize (This : in out Object) is
   procedure Free is new Ada.Unchecked_Deallocation (...);
begin
   if This.Worker /= null then
      This.Worker.Shut_Down;
      while not Worker'Terminated loop
         delay 0.1;
      end loop;
      Free (This.Worker);
   end if;
end Finalize;

Is it so?

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2011-08-30 16:42 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-30 13:22 Delayed deallocation of non-terminated task in Gnat? Marc C
2011-08-30 15:20 ` Dmitry A. Kazakov
2011-08-31 18:12   ` Robert A Duff
2011-08-31 19:23     ` Dmitry A. Kazakov
2011-08-31 20:58       ` Robert A Duff
2011-08-31 21:16         ` Jeffrey Carter
2011-08-31 20:25     ` J-P. Rosen
2011-08-31 21:09       ` Robert A Duff
2011-08-31 21:53         ` Simon Wright
2011-08-30 15:38 ` Adam Beneschan
2011-08-30 16:42   ` Dmitry A. Kazakov [this message]
2011-08-30 18:57     ` Niklas Holsti
2011-08-30 19:23       ` Dmitry A. Kazakov
2011-08-31 16:39   ` Adam Beneschan
2011-08-31 18:21     ` Robert A Duff
2011-08-31 23:28       ` Adam Beneschan
2011-09-01 11:58         ` Robert A Duff
2011-08-31 20:30     ` J-P. Rosen
2011-08-31 22:36       ` Adam Beneschan
2011-09-01  5:24         ` J-P. Rosen
2011-08-31 18:08 ` Robert A Duff
replies disabled

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