comp.lang.ada
 help / color / mirror / Atom feed
From: Jeff Creem <jcreem@yahoo.com>
Subject: Re: GNAT GPL for Mac OSX stack checking problem
Date: Fri, 07 Oct 2005 09:00:10 -0400
Date: 2005-10-07T09:00:10-04:00	[thread overview]
Message-ID: <cNmdnVejVKal7NveRVn-qg@comcast.com> (raw)
In-Reply-To: <KIRoJuEXw9g9-pn2-kJWIGULSzTkD@ecs>

Kevin K wrote:
> The compiler and GPS seem to work, it is the generated test driver 
> that I'm having problems with.
> 
> I saw 10.3 referenced when I downloaded it, but I have a history with 
> the Linux versions where you can, at times, run the compiler on a 
> different version than they built on.  For instance, the versions 
> build for Redhat 7.1 could run on 7.2, 7.3, 8, EL 2.1, but GLIBC 
> differences essentially required a new version from Adacore for RH9, 
> EL3, etc.  (The change to the new threading library).
> 
> I just took a look at the ulimit command.  I would have to look at the
> documentation to increase it under macos, but traditionally, the stack
> you are changing with this command is the Environment stack, which is 
> the stack for the actual main procedure, NOT the tasks for individual 
> tasks.  If GNAT, on the Mac, is putting all the tasks I declared in 
> the procedure declare section into the environment stack, that is 
> different behavior than any other Ada compiler I've used, since the 
> Linux GNAT uses the heap, Rational Apex uses the heap, the VADs Ada83 
> compiler used the heap, and Alsys on Unix used the heap.
> 
> Essentially, my test procedure was
> 
> procedure test_tasks is
> 
>   task type task_type is
>     pragma storage_size(10000000);
> 
>     entry start;
>   end;
> 
>   task body test_tasks is
>    
>   begin
> 
>     accept start;
> 
>     loop
>       putline("task num");
>       delay 10.0;
>       stack_user;
>     end loop;
>   end;
> 
>   procedure stack_user is
>     buffer:string(1..2048);
> 
>   begin
>       buffer(1):=' ';
>       stack_user;
>   exception
>      when storage_error=> text_io.put_line("Storage_Error");
>   end;
> 
>   the_tasks : array(1..10) of task_type;
> 
> begin
> 
>    --Call Start on all tasks
> 
> end;
> 
> 

It is not clear that one should expect to see 100 Megs actually used on 
all OS's if the stack check logic is flawed. Some OSs do not actually 
commit usage of the memory until it is accessed. Given the way this is 
written, it seems like it would be perfectly valid for the first task to 
take off and run into that infinite recusion and blow its stack before 
any other task gets any CPU time. Now if they each did this before the 
program  terminated I guess one would see the 100 Meg usage.. So it 
sounds like the problem is not really that you are running into an early 
stack limit but rather that the stack checking is not operating properly 
resulting in the program terminating instead of each tasking running one 
after another.

Sounds to me like the interaction of gcc and macos is not doing proper 
stack checking.



  reply	other threads:[~2005-10-07 13:00 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-06 22:47 GNAT GPL for Mac OSX stack checking problem Kevin K
2005-10-07  1:27 ` jim hopper
2005-10-07 12:10   ` Kevin K
2005-10-07  2:48 ` John B. Matthews
2005-10-07 12:25   ` Kevin K
2005-10-07 13:00     ` Jeff Creem [this message]
2005-10-08  0:05       ` Kevin K
2005-10-08  6:27   ` Simon Wright
2005-10-08 18:01   ` jim hopper
replies disabled

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