Are Fibers just broken in D?

Radu void at null.pt
Tue Apr 24 19:45:04 UTC 2018


On Tuesday, 24 April 2018 at 16:05:48 UTC, Steven Schveighoffer 
wrote:
> On 4/24/18 10:16 AM, Radu wrote:
>> On Tuesday, 24 April 2018 at 13:36:48 UTC, Steven 
>> Schveighoffer wrote:
>>> On 4/24/18 5:11 AM, bauss wrote:
>>>> On Tuesday, 24 April 2018 at 07:58:01 UTC, Radu wrote:
>>>>> On Tuesday, 24 April 2018 at 00:46:39 UTC, Byron Heads 
>>>>> wrote:
>>>>>> [...]
>>>>>
>>>>> This is not a fiber issue but a more memory management 
>>>>> issue. Your run out of address space on win32, the GC will 
>>>>> not always collect all those 99999 fibers that you allocate 
>>>>> in that loop. As an exercise replace `auto` with `scope` 
>>>>> like `scope foo = new Foo();` in that loop - you should see 
>>>>> different results.
>>>
>>> This shouldn't be a requirement, the 32-bit GC is generally 
>>> not this bad.
>>>
>> 
>> Allocating so many fibers in a loop produces an OOM error on 
>> win32, that's a fact! Event though it doesn't always happen 
>> you often get OOM errors with the program above.
>
> I'm not saying it doesn't happen, just that it *shouldn't* 
> happen. At least not for small sized chunks like this.
>
> I want to emphasize that the program is allocating and 
> releasing to the GC 1 fiber at a time -- loop or no loop, this 
> should work (more or less) reliably, or Win32 has some more 
> serious issues.
>

Changing main to
---
void main(string[] args)
{
     import core.memory;
     foreach(ulong i; 0..99_999) {
         auto foo = new Foo();
         foo.call();
         foo.call();
         if (i % 10000) // <-- this
             GC.collect();
     }
}
---

makes the OOM error go away.



More information about the Digitalmars-d-learn mailing list