From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,c07a147fda119dba,start X-Google-Attributes: gid103376,public From: james@sandy.mcci-arl-va.com (Scott James) Subject: Asynchronous communication between protected types Date: 1998/07/21 Message-ID: <6p2cvs$u2$1@client2.news.psi.net>#1/1 X-Deja-AN: 373534272 Organization: MCCI, Arlington VA Newsgroups: comp.lang.ada Date: 1998-07-21T00:00:00+00:00 List-Id: I'm trying to connect concurrent objects via an asynchronous message. I was hoping to do this entirely with protected objects, however, cannot seem to do so. The difficulty I have is that even if I put the receiver into a loop (waiting on a send entry) it seems that *some* task has to start the receiver, so I will still need one (Ada) task per (active) receiver. About the best I can come up is the following code. This is acceptable for my purposes but I was curious if I could trick this into working using only protected types. (and without the distribution annex's Asynchronous Pragma either :-) (some code snippets borrowed from _Concurrency in Ada (95)_) ----------------------------------------------------------- with Ada.Text_IO; procedure Test_Persistent is type Messages is (Run, Die); protected type Persistent_Signals is procedure Send (Message: Messages); entry Wait (Message: out Messages); private Message: Messages; Signal_Arrived: Boolean:=False; end Persistent_Signals; protected body Persistent_Signals is procedure Send (Message: Messages) is begin Persistent_Signals.Message:=Message; Signal_Arrived:=True; end Send; entry Wait (Message: out messages) when Signal_Arrived is begin Signal_Arrived:=False; Message:=Persistent_Signals.Message; end Wait; end Persistent_Signals; type Access_To_Persistent_Signals is access Persistent_Signals; task type Processes is entry Initialize (With_Signal: Access_To_Persistent_Signals); end Processes; task body Processes is Message: Messages; Signal: Access_To_Persistent_Signals; begin accept Initialize (With_Signal: Access_To_Persistent_Signals) do Signal:=With_Signal; end Initialize; loop Signal.Wait (Message); case Message is when Run => Ada.Text_IO.Put_Line ("I'm running"); when Die => exit; end case; end loop; end Processes; Process: Processes; Signal: Access_To_Persistent_Signals; begin Signal:=new Persistent_Signals; Process.Initialize (Signal); for I in 1 .. 4 loop Signal.Send (Run); delay 0.5; end loop; Signal.Send (Die); end Test_Persistent; -- Dr. Scott James james@mcci-arl-va.com