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. >>> ``` >>> >>>