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;
}
--
Philippe.
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help