comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Deallocating records with task type fields.
Date: Sat, 10 Dec 2005 15:10:50 +0100
Date: 2005-12-10T15:10:33+01:00	[thread overview]
Message-ID: <1vb61utj75dws.gjbmfyig7vzz.dlg@40tude.net> (raw)
In-Reply-To: 1134168554.826805.70690@g49g2000cwa.googlegroups.com

On 9 Dec 2005 14:49:14 -0800, Gene wrote:

> Please consider these declarations for a task with some task local
> data:
> 
>    type Listener_Type;
> 
>    task type Listener_Task_Type(Env : access Listener_Type);
> 
>    type Listener_Type is
>       record
>          Port : Positive;
>          Executive : Listener_Task_Type(Listener_Type'Access);
>       end record;
> 
> With this, the executive task has access to the task local environment
> exemplified here by a port number.
> 
> Here are the questions:
> 
> 1.  Is this a good idiom for implementing task local data, or is there
> some other preferable method?
>
> 2.  As I read the ALRM it is incorrect to deallocate a Listener_Type
> object until the Executive task has exited.  What is a good idiomatic
> way for the Executive to deallocate its own task local storage just
> before it exits and without causing a race condition?  [The only ways I
> can come up with seem like excessive machinery.] 

Not really. If data are local then it is task's responsibility to maintain 
them. Your design inverses this: the life span of environment must enclose 
one of the task. I presume that you are trying to bring parameters of a 
task and the local data under one roof. It can work in only simple cases.

Possible alternatives:

1. Local things are on the task's stack. Parameters are passed through 
discriminants.

2. Same as above, but parameters are passed via Start entry point

3. Task is encapsulated into a controlled object which has the parameters 
and data. A pragmatic way to do this is to have a task pointer as a 
component, so that task might be allocated separately from the object. 
Otherwise, there will be problems with initialization and finalization.

4. Smart pointers with reference counting. If you want to create a resource 
(like local data) for a task in one place and collect it in another (upon 
task exit) then smart pointers is a safe way to do it.

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



  parent reply	other threads:[~2005-12-10 14:10 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-09 22:49 Deallocating records with task type fields Gene
2005-12-10  7:16 ` Jeffrey R. Carter
2005-12-10 11:45   ` Simon Wright
2005-12-10 14:10 ` Dmitry A. Kazakov [this message]
2005-12-11  4:06   ` Gene
2005-12-11 11:50     ` Dmitry A. Kazakov
2005-12-12 11:32       ` Alex R. Mosteo
2005-12-12 18:30         ` Pascal Obry
2005-12-13 10:22           ` Alex R. Mosteo
2005-12-12 22:03     ` Randy Brukardt
2005-12-11  5:02   ` Gene
replies disabled

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