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.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,41967527237c1aa2,start X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!postnews.google.com!r56g2000hsd.googlegroups.com!not-for-mail From: mhamel_98@yahoo.com Newsgroups: comp.lang.ada Subject: Fun with Tasking Date: 28 Mar 2007 08:53:16 -0700 Organization: http://groups.google.com Message-ID: <1175097196.113031.259000@r56g2000hsd.googlegroups.com> NNTP-Posting-Host: 155.104.37.17 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1175097197 30246 127.0.0.1 (28 Mar 2007 15:53:17 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Wed, 28 Mar 2007 15:53:17 +0000 (UTC) User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MathPlayer 2.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727),gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: r56g2000hsd.googlegroups.com; posting-host=155.104.37.17; posting-account=RO8m9AwAAAB418WhNxD6U0JmFC9jLoK1 Xref: g2news1.google.com comp.lang.ada:14650 Date: 2007-03-28T08:53:16-07:00 List-Id: Below is sample code I made representing something I wanted to do with a program, of course it doesn't work quite the way I would like. Hopefully this sample doesn't cause eye (or brain) injury, it is more symbolic than useful - the procedure "Exec" is, of course, really a package (rather, several similar packages). The problem is, how to "transport" a task? As seen in the sample below, I would like to use just a single address in the Control_Block type, but it's never that simple, is it? In actuality, how I get this program in its full incarnation to work is to define the "test_task"s in the acc_add_test part of the program. I really don't like doing this, as I mentioned, "exec" is representative of a family of several different packages. I would like the task definition to be local to the "exec" pacakage(s), not all kludged together in acc_add_test, which then requires all sorts of (ideally private) types being moved out of the local "exec" packages into acc_add_test and then the Control_Block record now has nearly a dozen different task pointers stuffed into it, only one of which is going to be used at any given time. One last caveat, the Acc_Add_Test program should have *no* visibility into the "exec" procedure/package. The "exec" package(s), in fact, "push" their procedures into the main program. So is there something simple I'm having a brain fart over in missing here, or is a complete re-architecture required here? with Text_Io; with System; with System.Address_To_Access_Conversions; procedure Acc_Add_test is Exec_Count : constant Natural := 10; type Control_Block is record Task_Addr : System.Address; end record; type Mode_Type is (preprocess, process); procedure Exec (Mode : in Mode_Type; Cntl : in out Control_Block) is task type Test_Task is entry Start (Addr : System.Address); entry Complete; end Test_Task; package Convert is new System.Address_To_Access_Conversions (Test_Task); use Convert; task body Test_Task is Task_Ptr : Convert.Object_Pointer := null; Count : Natural := 0; begin loop begin select accept Start (Addr : System.Address) do Task_Ptr := Convert.To_Pointer (Addr); end Start; or accept Complete do Count := Count + 1; end Complete; if Count = Exec_Count then Text_Io.Put_Line ("Completed All Tasks"); abort Task_Ptr.all; end if; end select; end; end loop; end Test_Task; begin case Mode is when Preprocess => declare Task_Ptr : Convert.Object_Pointer; Address : System.Address; begin Task_Ptr := new Test_Task; Address := Convert.To_Address (Task_Ptr); Task_Ptr.Start (Address); Cntl.Task_Addr := Address; end; when Process => declare Task_Ptr : Convert.Object_Pointer; begin Task_Ptr := Convert.To_Pointer (Cntl.Task_Addr); Task_Ptr.Complete; end; end case; end Exec; Controls : Control_Block; begin Exec (Preprocess, Controls); for I in 1 .. Exec_Count loop Exec (Process, Controls); end loop; end Acc_Add_Test; Thanks for any input!