This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: CreateFiber() : number of fibers limited


On Sun, Jun 03, 2001 at 12:16:07PM +0200, Holger Vogt wrote:
> Hi,
> 
> independently of the requested stack size (first parameter in
> CreateFiber()), CYGWIN will give only 53 fibers. Only when I increase
> the stack size above 9.5 MByte, I will get a further reduction in the
> number of fibers created.

I was intrigued by this difference between gcc and Borland C++Builder and MS
Visual C++, so I tried the following code under all three compilers on
Win2K:

---

#define _WIN32_WINNT 0x0500 /* Coax winbase.h into including
                               ConvertThreadToFiber() */
#include <windows.h>
#include <stdio.h>

#define MEG       (1024 * 1024)
#define STACKSIZE (MEG * 2)

int main()
{
        int param = 0, i = 0;
        LPFIBER_START_ROUTINE saddr = NULL;
        LPVOID foo;

        ConvertThreadToFiber(&param);

        while(++i) {

                foo = CreateFiber(STACKSIZE, saddr, &param);

                if(foo != NULL)
                        printf("Created fiber 0x%08x.\n", foo);
                else {
                        printf("Failed to create fiber at iteration %d;\n"
                                "stack space allocated: %dMB\n",
                                i, (STACKSIZE * i) / MEG);
                        break;
                }
        }

        return 0;
}

---

The results are definitely interesting. The runtime code generated by VC++
(6.0) and BCB (bcc32.exe v5.5) will allow stack allocation by fibers until
total stack space allocated hits the free memory limit on the system.

Whereas with gcc, no matter how small you make your stack, the maximum
number of fibers will be 52. (If it was 42, I'd suspect somebody was taking
the Hitchhiker's Guide to the Galaxy a wee bit too seriously.)

All in all, I don't think this is a bug in the library. It definitely looks
like a hard limit on the number of stacks/fibers you can allocate --
something of the sort Danny Smith proposed, but "harder". Without looking at
the source, I doubt anybody would be able to pin it down (unless they happen
to be the gcc maintainer).

You might want to ask on the gcc mailing list(s).

Cheers,

  -- danp

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]