Ah, indeed, so a workaround would be:

my $lock = Lock.new;
my $set  = SetHash.new;
await ^16 .map: {
   start {
      for ^10000 {
         $lock.protect: { $set<1> = True; 1 }
         $lock.protect: { $set<1> = False; 1 }
      }
   }
}

So maybe a solution would be to test for Proxy of the return value of the 
block, and then sink it?

> On 14 Nov 2017, at 16:59, Timo Paulssen via RT <perl6-bugs-follo...@perl.org> 
> wrote:
> 
> I already figured out that it's about sinking the result of assigning to
> the SetHash. When you access it you get a proxy, that is the return
> value of the lock-protected block, and the proxy gets sunk outside of
> it, thus causing concurrent access to the SetHash.
> 
> 
> On 14/11/17 16:03, Elizabeth Mattijsen wrote:
>> reducing the code to:
>> 
>> use nqp;
>> my $lock = Lock.new;
>> my $hash := nqp::hash;
>> await ^16 .map: {
>>   start {
>>      for ^1000 {
>>         $lock.protect: { nqp::bindkey($hash,"a",1) }
>>         $lock.protect: { nqp::deletekey($hash,"a") }
>>      }
>>   }
>> }
>> 
>> does *not* make it crash.  So it would appear that it’s not the lowlevel 
>> hash access that’s to blame.  Looking at this with Telemetry.snapper, this 
>> *does* seem to eat a lot of memory very quickly.  With a slightly bigger 
>> version, and much longer running, growth to about 490MB is observed 
>> (starting from 69MB) in 35 seconds, then remaining constant for about 125 
>> seconds, after which a modest increase of only about 15KB per second was 
>> observed for the remainder of the run.
>> 
>> So the next maybe it’s something in handling Proxy. 
>> 
>> 
>>> On 10 Nov 2017, at 03:28, David Lowe <j.david.l...@gmail.com> wrote:
>>> 
>>> This crash still occurs with rakudo 2017.10.
>>> 
>>> On Thu, Oct 5, 2017 at 9:10 PM, perl6 via RT <perl6-bugs-follo...@perl.org> 
>>> wrote:
>>> Greetings,
>>> 
>>> This message has been automatically generated in response to the
>>> creation of a trouble ticket regarding:
>>>        "segmentation fault while concurrently updating SetHash",
>>> a summary of which appears below.
>>> 
>>> There is no need to reply to this message right now.  Your ticket has been
>>> assigned an ID of [perl #132225].
>>> 
>>> Please include the string:
>>> 
>>>         [perl #132225]
>>> 
>>> in the subject line of all future correspondence about this issue. To do so,
>>> you may reply to this message.
>>> 
>>>                        Thank you,
>>>                        perl6-bugs-follo...@perl.org
>>> 
>>> -------------------------------------------------------------------------
>>> This short program crashes reliably (with a segmentation fault) on my
>>> system:
>>> 
>>> ```
>>> #!/usr/bin/env perl6
>>> 
>>> use v6.c;
>>> 
>>> my $lock = Lock.new;
>>> my $set  = SetHash.new;
>>> await (^12).map: {
>>>   start {
>>>      for (^1000) {
>>>         $lock.protect: { $set<1> = True  }
>>>         $lock.protect: { $set<1> = False }
>>>      }
>>>   }
>>> }
>>> ```
>>> 
>>> More information:
>>> 
>>> ```
>>> $ perl6 --version
>>> This is Rakudo version 2017.09 built on MoarVM version 2017.09.1
>>> implementing Perl 6.c.
>>> ```
>>> 
>>> 

Reply via email to