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;
> }
>
Just in case you don't think getrlimit() results also apply to the main thread:
#include <sys/resource.h>
#include <stdio.h>
#include <pthread.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 {
pthread_attr_t attr;
size_t stacksize;
void *stackbase;
if (!pthread_getattr_np(pthread_self(), &attr)) {
pthread_attr_getstack(&attr, &stackbase, &stacksize);
printf("stacksize = %lu\n", stacksize);
}
}
return 0;
}
--
Philippe.
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help