From: mmcnett@sparc53.cs.uiuc.edu (mcnett michael david)
Subject: Tasking and C-interfaces - variable storage
Date: 3 Nov 94 19:47:12 GMT
Date: 1994-11-03T19:47:12+00:00 [thread overview]
Message-ID: <mmcnett.783892032@sparc53.cs.uiuc.edu> (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 |
next reply other threads:[~1994-11-03 19:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
1994-11-03 19:47 mcnett michael david [this message]
1994-11-05 3:17 ` Tasking and C-interfaces - variable storage R. William Beckwith
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox