[Python-Dev] find_recursionlimit.py vs. libpthread vs. linux

Charles G Waldman cgw@fnal.gov
Mon, 11 Sep 2000 13:55:09 -0500 (CDT)

It has been noted by people doing testing on Linux systems that

ulimit -s unlimited
python Misc/find_recursionlimit.py

will run for a *long* time if you have built Python without threads, but
will die after about 2400/2500 iterations if you have built with
threads, regardless of the "ulimit" setting.

I had thought this was evidence of a bug in Pthreads.  In fact
(although we still have other reasons to suspect Pthread bugs),
the behavior is easily explained.  The function "pthread_initialize"
in pthread.c contains this very lovely code:

  /* Play with the stack size limit to make sure that no stack ever grows
     beyond STACK_SIZE minus two pages (one page for the thread descriptor
     immediately beyond, and one page to act as a guard page). */
  getrlimit(RLIMIT_STACK, &limit);
  max_stack = STACK_SIZE - 2 * __getpagesize();
  if (limit.rlim_cur > max_stack) {
    limit.rlim_cur = max_stack;
    setrlimit(RLIMIT_STACK, &limit);

In "internals.h", STACK_SIZE is #defined to (2 * 1024 * 1024)

So whenever you're using threads, you have an effective rlimit of 2MB
for stack, regardless of what you may *think* you have set via 
"ulimit -s"

One more mystery explained!