Philippe Gerum wrote:
 > Gilles Chanteperdrix wrote:
 > > On Thu, Apr 10, 2008 at 4:36 PM, Philippe Gerum
 > > <[EMAIL PROTECTED]> wrote:
 > >> Gilles Chanteperdrix wrote:
 > >>  > On Thu, Apr 10, 2008 at 2:53 AM, Philippe Gerum
 > >>  > <[EMAIL PROTECTED]> wrote:
 > >>  >> Robert McCullough wrote:
 > >>  >>  > Hi Gilles,
 > >>  >>  >
 > >>  >>  >   --> -----Original Message-----
 > >>  >>  >   --> From: Gilles Chanteperdrix [mailto:[EMAIL PROTECTED]
 > >>  >>  >   --> Sent: Wednesday, April 09, 2008 3:29 PM
 > >>  >>  >   --> To: [EMAIL PROTECTED]
 > >>  >>  >   --> Cc: [email protected]
 > >>  >>  >   --> Subject: Re: [Xenomai-help] mlockall questions
 > >>  >>  >   -->
 > >>  >>  >   --> Robert McCullough wrote:
 > >>  >>  >   -->  > Hi,
 > >>  >>  >   -->  >
 > >>  >>  >   -->  > I am converting part of a C++ application to real-time.
 > >>  >>  >   -->  >
 > >>  >>  >   -->  > I noticed that all the Xenomai examples call
 > >>  >>  >   -->  > mlockall(MCL_CURRENT|MCL_FUTURE) at the beginning of main 
 > >> before
 > >>  >>  >   --> creating
 > >>  >>  >   -->  > any real-time threads.
 > >>  >>  >   -->  > Is calling mlockall a requirement when using Xenomai?
 > >>  >>  >   -->
 > >>  >>  >   --> Yes it is.
 > >>  >>  >   -->
 > >>  >>  > [Robert McCullough]
 > >>  >>  > OK.
 > >>  >>  >   -->  >
 > >>  >>  >   -->  > I have added a couple of Xenomai tasks to my C++ app.
 > >>  >>  >   -->  > A) Without calling mlockall my application seems to run 
 > >> fine but I
 > >>  >>  >   --> noticed
 > >>  >>  >   -->  > in /proc/xenomai/stat that a few page faults occurred.
 > >>  >>  >   -->
 > >>  >>  >   --> Well normally your application should stop with a message 
 > >> telling you
 > >>  >>  >   --> that you have not call mlockall. Do you happen to install a 
 > >> handler
 > >>  >>  >   --> for
 > >>  >>  >   --> SIGXCPU ?
 > >>  >>  > [Robert McCullough]
 > >>  >>  > Yes.
 > >>  >>  >   -->
 > >>  >>  >   -->  > B) When calling mlockall at the beginning of my main() I 
 > >> do not see
 > >>  >>  >   --> any page
 > >>  >>  >   -->  > faults but some of the C++ threads do not start.
 > >>  >>  >   -->  >
 > >>  >>  >   -->  > Why would mlockall cause some threads not to start?
 > >>  >>  >   -->
 > >>  >>  >   --> Well, you should check rt_task_create or pthread_create 
 > >> return
 > >>  >>  >   --> value. The usual error is that you run out of memory because 
 > >> of the
 > >>  >>  >   --> stack size problem explained in the TROUBLESHOOTING guide.
 > >>  >>  >   -->
 > >>  >>  >   --> --
 > >>  >>  >   -->
 > >>  >>  >   -->
 > >>  >>  >   -->                                             Gilles.
 > >>  >>  > [Robert McCullough]
 > >>  >>  > Thanks.
 > >>  >>  > Calling "ulimit -s 2048" before my application in my startup 
 > >> script seems to
 > >>  >>  > work fine when I am running over nfs to the Denx ELDK with a bash 
 > >> shell.
 > >>  >>  > But my application needs to run from a CompactFlash card running 
 > >> BusyBox on
 > >>  >>  > a MPC5200 and BusyBox does not seem to support the "ulimit" 
 > >> command.
 > >>  >>  > Is there another way to set this stack limit size?
 > >>  >>  >
 > >>  >>
 > >>  >>  - Setting the stack size property into the attribute struct for each 
 > >> new pthread
 > >>  >>  your application may create: pthread_attr_setstacksize(&thattr, 
 > >> stacksize);
 > >>  >>
 > >>  >>  - Or passing the right stack size value to any (non-POSIX) Xenomai 
 > >> API task
 > >>  >>  creation service, we do enforce it (e.g. rt_task_create(), 
 > >> taskInit(),
 > >>  >>  t_create()...).
 > >>  >>
 > >>  >>  - Or calling setrlimit(RLIMIT_STACK, ...) to set a global default 
 > >> value for all
 > >>  >>  subsequent glibc-originated threads. This is what the ulimit command 
 > >> does, actually.
 > >>  >
 > >>  > The problem of pthread_attr_setstacksize (or of setting stack size in
 > >>  > one of the various thread creation services) is that it does not work
 > >>  > for the main thread stack. So, you have to use ulimit or to call
 > >>  > setrlimit before running your application, in order to set the main
 > >>  > thread stack size.
 > >>  >
 > >>  > Now about the ulimit builtin in busybox: busybox ash shell supports 
 > >> ulimit.
 > >>  >
 > >>
 > >>  Even if you don't have any shell supporting ulimit, you just need to 
 > >> create a
 > >>  small launcher that basically forks/setrlimit+execs your application.
 > > 
 > > Errr... but you need to call setrlimit before fork, otherwise it is too 
 > > late...
 > >
 > 
 > #include <sys/resource.h>
 > #include <stdio.h>
 > #include <unistd.h>
 > #include <stdlib.h>
 > 
 > int main(int argc, char *argv[])
 > {
 >      if (strcmp(argv[0], "child")) {
 >              struct rlimit r = { .rlim_cur = 32768, .rlim_max = 32768 };
 >              setrlimit(RLIMIT_STACK, &r);
 >              execl(argv[0], "child", NULL);
 >      } else {
 >              struct rlimit r;
 >              if (getrlimit(RLIMIT_STACK, &r) == 0)
 >                      printf("%s: stack size = %d\n", argv[0], r.rlim_cur);
 >      }
 > 
 >      return 0;
 > }

I had a doubt about what I wrote, just after writing it, which is why I
started doing my own testing. But I got distracted by the fact that all
the main thread stack was no longer commited. Now, I wonder, do you
think we should try to work around this behaviour in the I-pipe patch ?

-- 


                                            Gilles.

_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to