comp.lang.ada
 help / color / mirror / Atom feed
From: Shark8 <onewingedshark@gmail.com>
Subject: Re: Advice, tasking and hardware
Date: Fri, 27 May 2016 12:13:19 -0700 (PDT)
Date: 2016-05-27T12:13:19-07:00	[thread overview]
Message-ID: <cf38020c-a34c-4c8d-b436-5e622100e58b@googlegroups.com> (raw)
In-Reply-To: <ni8u8j$1h74$1@gioia.aioe.org>

On Friday, May 27, 2016 at 1:50:50 AM UTC-6, Dmitry A. Kazakov wrote:
> 5. Tasks entries have parameter passing problems. If you don't handle 
> everything in the rendezvous in order to release the caller as soon as 
> possible, you need to copy parameters and store them locally. The design 
> of the select statement prevents doing this in a structured way. E.g.
> 
>     select
>        accept String_Call (Text : String) do
>           Local_Text := Text; -- Accept scope
>        end;
>        declare -- Handler's scope
>           Local_Text : String -- This does not work!
>        begin
>           -- Process Local_Text
>        end;
>     or accept ...

Pretty much a non-problem in Ada 2012:

    package Example is
	
	Task Text_IO is
	    Entry Get( Data : String );
	    Entry Put;
	    Entry Done;
	End Text_IO;
	
    end Example;
    
    package body Example is
	
	Task Body Text_IO is
	    Package String_Holder is new Ada.Containers.Indefinite_Holders(
	      Element_Type => String );

	    Internal_Data : String_Holder.Holder:= String_Holder.To_Holder("");
	    Finished      : Boolean := False;
	begin
	    loop
		select
		    accept Done do
			Finished:= True;
		    end Done;
		or
		    accept Get (Data : in String) do
			Internal_Data:= String_Holder.To_Holder( Data );
		    end Get;
		or
		    accept Put do
			Ada.Text_IO.Put_Line( "DATA: "& Internal_Data.Element );
		    end Put;
		end select;
		
		Exit when Finished;
	    end loop;
		
	End Text_IO;
	
    end Example;

and used via:
    Example.Text_IO.Put;
    Example.Text_IO.Get( "Test Data" );
    Example.Text_IO.Put;
    Example.Text_IO.Get( "Something Else" );
    Example.Text_IO.Put;

    Example.Text_IO.Done;

> 6. Task entries cannot return unconstrained objects.

This can be worked around:
   We can add to the previous task the following:
	    Entry Data( Item : out Natural );
	    Entry Data( Item : out String );
   Where the one returns the constraints needed for the other... it would be used something like this:
    declare
	Length : Natural renames Example.Text_IO.Data;
	Test   : constant String(1..Length):= Example.Text_IO.Data;
    begin
	Put_Line ( "----- " & Test & " -----" );
    end;


  parent reply	other threads:[~2016-05-27 19:13 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-25 21:24 Advice, tasking and hardware patrick
2016-05-26  1:09 ` Jeffrey R. Carter
2016-05-26  8:13   ` Simon Wright
2016-05-26  7:26 ` Dmitry A. Kazakov
2016-05-26 16:41   ` patrick
2016-05-26 17:56     ` Dmitry A. Kazakov
2016-05-26 20:35     ` Jeffrey R. Carter
2016-05-26 19:35   ` Jeffrey R. Carter
2016-05-26 20:51     ` patrick
2016-05-27  7:50     ` Dmitry A. Kazakov
2016-05-27 18:00       ` Simon Wright
2016-05-27 19:06       ` Jeffrey R. Carter
2016-05-27 22:05         ` Randy Brukardt
2016-05-27 23:09           ` Jeffrey R. Carter
2016-05-27 19:13       ` Shark8 [this message]
2016-05-27 20:27         ` Dmitry A. Kazakov
2016-05-27 22:27           ` Randy Brukardt
2016-05-28  6:49             ` Dmitry A. Kazakov
2016-05-28 14:38           ` Shark8
2016-05-28 15:45             ` Dmitry A. Kazakov
2016-05-28  0:25 ` rieachus
2016-05-28  1:57   ` patrick
2016-05-28  4:13   ` Jeffrey R. Carter
2016-06-01 14:37     ` rieachus
2016-06-01 19:09       ` Dmitry A. Kazakov
2016-06-06  3:33         ` rieachus
2016-06-06  7:18           ` Dmitry A. Kazakov
2016-06-07 16:53             ` rieachus
2016-06-07 20:21               ` Dmitry A. Kazakov
2016-06-08  4:06                 ` rieachus
2016-06-08  7:29                   ` Dmitry A. Kazakov
2016-06-08 12:56                     ` rieachus
2016-06-08  0:19               ` Dennis Lee Bieber
replies disabled

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