Geth rakudo/ugexe-patch-3: ca0b8fcd02 | (Nick Logan)++ (committed using GitHub Web editor) | src/core.c/CompUnit/Repository/Installation.pm6
Fix 'too many open files' during module uninstall

Recently uninstalling modules might give a 'too many open files' error. By making a call to `.dir` eager this error goes away, although I'm not clear why or what changed in e.g. libuv that would require this now.
rakudo: ugexe++ created pull request #4333:
Fix 'too many open files' during module uninstall
00:55 japhb left, japhb_ joined 01:11 kvw_5 joined 01:14 kvw_5_ left 01:30 japhb_ left 01:32 japhb joined 01:34 lucasb left 01:48 MasterDuke left 02:51 japhb left 02:53 japhb joined 03:56 sivoais left 04:08 sivoais joined 06:06 softmoth left
Geth rakudo: 62c976a43c | (Elizabeth Mattijsen)++ | src/core.c/Rakudo/Iterator.pm6
Oops, forgot to close the dir handle

For the case of a IO::Path.dir with an explicit test in e.g. a for loop or anything else that would call .pull-one on the iterator.
Related to #4333
08:08 linkable6 left
nwc10 Well d'oh! I expect that explains a lot :-) 08:09
lizmat actually, no 08:10
but it was at least an oversight
it does *not* fix #4333 08:11
08:11 linkable6 joined
lizmat question is really: if a Rakudo::Iterator::Dir object gets garbage collected, will it properly garbage collect $!dirhandle if it is still open 08:13
nwc10: any ideas on how to check that ?
or do we need a DESTROY method on it ? 08:14
if it does garbage collect the $!dirhandle correctly even when it's open, then we don't need a DESTROY method
nwc10 it's a good question, and I don't know 08:16
nine If I'm reading the code correctly, the answer is a bit surprising: we do close a directory handle when it's garbage collected but do not do so with file handles. 08:18
lizmat that feels like an even bigger oops ?
nine Not necessarily. IO::Handle does have a DESTROY that closes. And that may show us why we leave that to the HLL: it doesn't close STDIN, STDOUT and STDERR. 08:19
Which is a good thing I dare say 08:20
lizmat so that would mean the dir iterators do *not* need a DESTROY 08:23
although one could argue that maybe HLL should also be responsible for this?
in which case a DESTROY method *would* be necessary ?
08:28 MasterDuke joined
Geth rakudo: e9e3b5fba6 | (Elizabeth Mattijsen)++ | src/core.c/SetHash.pm6
Fix #4332

Turns out a check on number of elements was forgotten in this case.
roast: dffc2a4cec | (Elizabeth Mattijsen)++ | S02-types/sethash.t
Add test for #4332
08:36 linkable6 left
nine The current implementation probably assumes that there is no good reason _not_ to close a dir handle in gc_free. 08:37
08:38 linkable6 joined
MasterDuke should gc_free check it's not STD(IN|OUT|ERR)? 08:40
nine lizmat: even if we close the dir handle when it's garbage collected, it's quite possible that we run out of file descriptors long before that GC run happens. Especially if those dir handles make it into the 2nd generation. 09:18
lizmat nine: but a DESTROY method wouldn't help with that, would it ? 09:20
nine no 09:21
lizmat so basically: if IO::Path.dir { 09:22
as a way to see if there are directory entries in there, is bad
otoh, if IO::Path.dir.elems {
nine Unless we can make it safe. You seem to have ideas on that already :) 09:23
lizmat is wasteful, because it would read all entries in the dir (potentially many)
well... it *could* still break code
my $dir = "foo".IO.dir; if $dir { for $dir -> $entries } 09:24
would break
unless, I guess, the iterator would know to re-open the dir
09:28 domidumont joined 10:07 patrickb joined
lizmat meh: you create specialized native candidates in a role, and then find out that all of the performance gained is lost in a repeated call to "accept_type" in the Metamodel :-) 10:40
:-( rather
11:03 patrickb left
lizmat afk& 11:22
13:05 frost-lab joined
MasterDuke DateTimes and Instants could/should be value types, right? 13:15
13:17 domidumont left 13:21 b2gills left 13:47 MasterDuke left 13:55 MasterDuke joined 14:01 b2gills joined 14:19 lucasb joined 14:40 frost-lab left 14:45 softmoth joined
[Coke] sees something about his module catching a bug? 14:51
looks like it's an actual bug and not "unicode added another cat emoji" 14:52
MasterDuke yeah 15:10
although writing to $sieve here isn't safe 15:11
because of the hypers 15:12
[Coke] good catch 15:15
nine And what a bug it is...
[Coke] MasterDuke: addeed 15:29
lizmat [Coke]: also of interest for raku-uni: 15:55
[Coke] I glanced at it but didn't get it. 15:56
lizmat you can drop the main loop in raku-uni 15:57
or am I missing something ?
16:16 domidumont joined
[Coke] to wrap up here (accidentally continued this in the wrong window), I wouldn't expect it to be much faster since app::uni is a single loop, but it is, but it's not quite the same logic. 16:17
sena_kun rba, ping? 16:22
lizmat Coke: $sieve = 0..0x10FFFF, $sieve.grep(*.uniname... 16:23
that's a pretty big loop :-)
sena_kun .tell rba it seems there are issues with free space on the raku-infra-fsn1-01 server. I would run something like `docker rm (docker container ls -aq)` to cleanup unused containers (this is what I think the command does), but given other services are hosted there I don't want to risk too much. Can you please look into it?
tellable6 sena_kun, I'll pass your message to rba
lizmat m: sub foo(@a) { }; my str @b; foo(@b) for ^1000000; say now - INIT now; # pretty fast 16:34
camelia 0.014332003
lizmat m: sub foo(str @a) { }; my str @b; foo(@b) for ^1000000; say now - INIT now; # not so fast :-(
camelia 1.253426504
16:34 domidumont left
lizmat m: say 1.253426504 / 0.014332003 16:34
camelia 87.456477926
lizmat so dispatching a native array to a native array is about 87x as slow? 16:35
MasterDuke lizmat: another example of ? 16:39
lizmat MasterDuke: thanks for reminding me 16:40
m: sub foo(array[str] \a) { }; my str @b; foo(@b) for ^1000000; say now - INIT now; # much faster 16:41
camelia 0.015926053
lizmat Guess I will be using that
17:16 domidumont joined 17:25 domidumont left 17:26 domidumont joined
Geth rakudo: 74af72de24 | (Elizabeth Mattijsen)++ | src/core.c/Baggy.pm6
Make Baggy.AT-KEY about 60% faster

Turns out that having a BEGIN thunk in a block prevents it from being inlined: target has a :noinline instruction - ins: capturele. Move the constant code to a constant, and use that instead.
rba sena_kun: I will look into the space issue. Thank you for letting me know. 17:38
tellable6 hey rba, you have a message:
17:50 domidumont left
Geth rakudo: 0bbeb2de42 | (Elizabeth Mattijsen)++ | src/core.c/Rakudo/Iterator.pm6
Make Rakudo::Iterator.Empty about 80x as fast

The BEGIN block prevented it from being inlined. Moved the compile time value into a constant, and now it does inline. And the bytecode being very small indeed (14 bytes) it will inline quickly.
This method is called in many places where it is clear from the beginning that an iterator will never produce any values.
lizmat there were other cases in the core, but these would still not inline for other reasons either 17:58
rba sena_kun: freeed some space 18:03
sena_kun rba++ 18:23
.oO( that sounded like a typical bofh response :-)
afk again& 18:30
18:43 Geth left 19:39 patrickb joined 20:19 patrickb left
samcv Hi everyone. Just wanted to announce that the PaperCall for the 2021 Perl and Raku Conference is open. So far we only have 1 Raku talk, and we would really love if we got more submissions from the Raku community. Thanks 20:35
21:44 lizmat left, lizmat joined