comp.lang.ada
 help / color / mirror / Atom feed
From: mhamel_98@yahoo.com
Subject: Fun with Tasking
Date: 28 Mar 2007 08:53:16 -0700
Date: 2007-03-28T08:53:16-07:00	[thread overview]
Message-ID: <1175097196.113031.259000@r56g2000hsd.googlegroups.com> (raw)

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!




             reply	other threads:[~2007-03-28 15:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-28 15:53 mhamel_98 [this message]
2007-03-28 16:55 ` Fun with Tasking Adam Beneschan
2007-03-28 17:53   ` mhamel_98
2007-03-28 20:06     ` Ed Falis
2007-03-28 22:17     ` Randy Brukardt
2007-03-29  4:59     ` Jeffrey R. Carter
2007-03-29 15:17       ` mhamel_98
2007-03-30  4:06         ` Steve
2007-03-30  5:46         ` Jeffrey R. Carter
2007-03-31 12:08         ` Stephen Leake
replies disabled

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