comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Advice on abort
Date: Tue, 8 Nov 2005 17:14:06 +0100
Date: 2005-11-08T17:14:06+01:00	[thread overview]
Message-ID: <1ozi307fng5fi$.1ms3kyzc7defi$.dlg@40tude.net> (raw)
In-Reply-To: 4370bc36$0$180$edfadb0f@dread11.news.tele.dk

On Tue, 08 Nov 2005 15:54:45 +0100, Poul-Erik Andreasen wrote:

> Dmitry A. Kazakov wrote:
>> On 7 Nov 2005 09:09:53 -0800, REH wrote:
>> 
>>>Poul-Erik Andreasen wrote:
>>>
>>>>REH wrote:
>>>>
>>>>>What are the best options when a task needs to be terminated, but
>>>>>signaling the task may not be possible?  We have tasks that sometimes
>>>>>need to be terminated, but may potentially be blocked on a resource,
>>>>>such as a socket.  Currently we use OS-specific calls to terminate the
>>>>>task, but I've never liked that.  I've been thinking of using the abort
>>>>>statement, but I don't think that's very graceful either.  I also would
>>>>>rather not complicate the code (or force polling behavior) by making
>>>>>the sockets non-blocking.  Any advice?
>>>>>
>>>>
>>>>One poosibillty is too use asyncronius transfer of control. Somthing
>>>>like this.
>>>>
>>>>select
>>>>    call.foo_entry  -- this i is a guarded entry in a protected
>>>>object or 				--	another task
>>>>    -- her can you have anything yuo may need to clean up after the abort
>>>>then abort
>>>>    listen_to_socket  this is the function wich may be blocked
>>>>end select
>>>>
>>>>Thee foo_entry basicly dosen't need to do anything. an you have onother
>>>>procedure or entry to open it.
>>>
>>>I was once advised never to use ATC because it is very slow.  Is this
>>>true?  It was in reference to GNAT.
>> 
>> That is not the main concern. The problem is the state in which aborting
>> would leave the socket and the corresponding port.

> I am not that good at sockets, So i vould like to know  wich problematic 
> (uncleanable) states wee are taking about.

It all depends on the particular implementation of the socket library and
how Ada tasks are mapped to system threads and processes. All sorts of
resource leaks are thinkable. For example, you might be unable to listen
that TCP/IP port until process restart or it won't abort etc.

>> Note also that what you want to do is not an Ada issue at all. Actually you
>> don't want to abort any Ada task. What you want is to cancel an OS
>> operation blocking some Ada task. This can be done *only* by means of the
>> OS being under consideration. There are little choices:
>> 
>> 1. Asynchronous I/O without blocking
>> 
>> 2. Synchronous I/O with some cancel operation invoked from outside (like
>> closing socket, or Abort_Selection proposed by Marc Criley)
> 
> This will however require that the sockets or select are made public in 
> some way, wich a dont like.

Not necessarily. It seems natural to decouple A) the higher level protocol
[encapsulates a task] from B) the communication object [likely passive,
encapsulates socket, COM port etc].

   type B is abstract new Root_Stream_Type with ... -- Abortable streams
   procedure Abort is abstract;

   type Socket_Stream is new B with private ...;
   type COM_Stream is new B with private ...;

   type A (Stream : access B'Class) is ...;
   procedure Abort (X : in out A);
private
   type A ... record
      Reader : Some_Task_Ptr;
   end record;

procedure Abort (X : in out A) is
begin
   Abort (X.Stream); -- Aborts I/O
   Free (Reader); -- Terminates the task
end Abort;

With Ada 2005 interfaces one could even avoid mix-ins.

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



  reply	other threads:[~2005-11-08 16:14 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-04 15:25 Advice on abort REH
2005-11-04 17:15 ` Marc A. Criley
2005-11-04 18:21 ` Dmitry A. Kazakov
2005-11-04 18:35   ` REH
2005-11-05 18:33   ` Simon Wright
2005-11-05 21:23     ` REH
2005-11-06 11:17       ` Simon Wright
2005-11-06 13:58         ` REH
2005-11-06 20:08           ` Simon Wright
2005-11-06 20:41             ` REH
2005-11-07 14:55 ` Poul-Erik Andreasen
2005-11-07 17:09   ` REH
2005-11-07 18:03     ` Dmitry A. Kazakov
2005-11-08 14:54       ` Poul-Erik Andreasen
2005-11-08 16:14         ` Dmitry A. Kazakov [this message]
2005-11-08 16:42           ` Marc A. Criley
2005-11-08 16:59           ` Poul-Erik Andreasen
2005-11-08 20:05             ` Dmitry A. Kazakov
2005-11-09 14:12               ` Poul-Erik Andreasen
2005-11-09 17:14                 ` Dmitry A. Kazakov
2005-11-08 16:32         ` Marc A. Criley
2005-11-08 14:35     ` Poul-Erik Andreasen
replies disabled

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