comp.lang.ada
 help / color / mirror / Atom feed
* Tasking and C-interfaces - variable storage
@ 1994-11-03 19:47 mcnett michael david
  1994-11-05  3:17 ` R. William Beckwith
  0 siblings, 1 reply; 2+ messages in thread
From: mcnett michael david @ 1994-11-03 19:47 UTC (permalink / raw)



I am having a problem concerning tasking. I am using GNAT-1.83 for Sparc 4.1.

It appears that when I instantiate a task, the variables that are directly 
defined in the task body are correctly being maintained (ie. a seperate copy
for each task instantiated).  However, I am making calls to several C routines
within each task, but it appears that each task is not maintaining its own
copies of the variables in those C routines.

Here are parts of the code with my understanding of the tasks at the
end of the code:


--*************************************************************************
--Driver
with Gen_Disk;
procedure Model is
  -- variables defined
begin
  -- set-up statements

   declare
      package HP_DISK is new GEN_DISK(Num_of_Disks);
      Disk_Array : array (1 .. Num_of_Disks) of HP_DISK.Handle;

   begin
      for i in 1 .. Num_of_Disks loop

         HP_DISK.create(Disk_Array(i));
         disk := i;
         busID := i;
         busOwner := BUS_FREE;
         results := HP_DISK.Disk_Init(Disk_Array(i),
                                      disk,
                                      busId,
                                      busOwner'address);

   end loop; -- Disk Initializations


   while NOT End_of_File (My_File) loop
	-- read in parameters from file

      HP_DISK.Disk_Transfer(Disk_Array(Integer(disk)),
                            other parm's);
      endtime := (HP_DISK.Elapsed(Disk_Array(Integer(disk))));

   end loop;

end Model;





package body Gen_Disk is
   task body Disk is
      package C_Procedure is new C_Procs;

   -- Ada variables defined here

   Start_Time  : C_Lib2.Time_T := C_Procedure.Gettime; -- for each disk
   Stop_Time   : C_Lib2.Time_T := C_Procedure.Gettime; -- for each disk
	                                                -- for each disk
   Initialized : Integer := 0;

   begin
      loop
         select
            when Initialized = 0 =>        -- only initialize each disk once
               accept Disk_Init (Disk         : in C_Lib2.C_Int;
                                 Busid        : in C_Lib2.C_Int;
                                 Busowner     : System.Address) do
	         -- initializes a disk through a c routine
               end Disk_Init;


         or
            when Initialized > 0 =>
               accept Disk_Transfer (foo...) do
                  Start_Time := C_Procedure.Gettime;
                  C_Procedure.Diskdevicetransfer(parms);
               end Disk_Transfer;

	-- other select statements -> one of which assigns a value to 
	--       stop_time through C_Procedure.Gettime call

         or terminate;
         end select;

      end loop;
   end Disk;




   procedure Create (A_Handle :out Handle) is
      My_Handle : Handle := new Disk;

   begin
      A_Handle := My_Handle;
   end Create;



   function Disk_Init (A_Disk : Handle;
                       --other parm's) return Integer is
   begin
      A_Disk.Disk_Init(Disk, Busid, Busowner);
      return 1;
   end Disk_Init;



   procedure Disk_Transfer(A_Disk : Handle;
                           --other parm's ) is
   begin
      A_Disk.Disk_Transfer(Disk, Sector, Nsectors, Write, Buffer);
   end Disk_Transfer;

	-- other procedures

end Gen_Disk;

--*************************************************************************
-- Sorry about including so much actual code.  I didn't know how to get
-- my point across without showing all of this.
--*************************************************************************




 Start_Time and Stop_Time are only set through a C_Procedure.Gettime
 call.  This call is made for each disk.

 The actual C routine GetTime simply checks a structure which stores
   a simulation time clock and returns that value.

 Now, to my understanding, for each disk task created, Start_Time, and
   Stop_Time should be unique for each of these disk tasks.

 When I create the HP_Disks from the Model procedure, the times
   are set correctly (ie. to 0).  When I do the first disk_transfer,
   for the first disk, the start_time is also correct (ie. 0).  The 
   Stop_Time is also correct for the first disk (say value x).

 Now, when the second disk gets to disk_transfer entry, its 
   Start_Time = 0 BEFORE the C_Procedure.Gettime call.  Now I call
   C_Procedure.Gettime thinking it should return 0. But instead,
   it returns x (the value returned to the first disk_transfer 
   Start_Time).

 It appears to me that the values of the second disk_transfer 
   C_Procedure Gettime should still be 0.  Am I wrong?

 So, MY QUESTION is: Does the value of the simulation clock time
   of the actual C routine maintained on a per task basis, or a
   per program basis?


Thanks in advance,

______________________________________________________________
Michael McNett               |
Graduate Student             |
University of Illinois       |
mmcnett@uiuc                 |



















^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Tasking and C-interfaces - variable storage
  1994-11-03 19:47 Tasking and C-interfaces - variable storage mcnett michael david
@ 1994-11-05  3:17 ` R. William Beckwith
  0 siblings, 0 replies; 2+ messages in thread
From: R. William Beckwith @ 1994-11-05  3:17 UTC (permalink / raw)


mcnett michael david (mmcnett@sparc53.cs.uiuc.edu) wrote:

: I am having a problem concerning tasking. I am using GNAT-1.83 for Sparc 4.1.

: It appears that when I instantiate a task, the variables that are directly 
: defined in the task body are correctly being maintained (ie. a seperate copy
: for each task instantiated).  However, I am making calls to several C routines
: within each task, but it appears that each task is not maintaining its own
: copies of the variables in those C routines.

Without seeing the C code I can only venture a guess that the C code is
using global (static) variables.  The stack based C variables (arguments
and locals automatic) should have separate copies for each task.  You
might want to make sure the size of each task's stack is large enough if
their are no global variables in the C code.

... Bill

-- 
e-mail: Bill.Beckwith@ois.com       |    Team Ada
Objective Interface Systems, Inc.   | dist, full O-O
1895 Preston White Drive, Suite 250 | multithreading
Reston, VA  22091-5448  U.S.A.      |    built in



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1994-11-05  3:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1994-11-03 19:47 Tasking and C-interfaces - variable storage mcnett michael david
1994-11-05  3:17 ` R. William Beckwith

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