01:47 ilbot3 joined 01:59 diakopter______ joined 02:28 colomon joined 03:17 cognominal joined 03:18 synopsebot6 joined 04:19 zostay joined, geekosaur joined 05:40 domidumont joined 05:42 domidumont joined 05:45 domidumont joined 06:10 domidumont joined 07:04 zakharyas joined 07:46 domidumont joined 07:58 dalek joined 07:59 retup__ joined, hoelzro joined, zostay joined 08:00 harrow joined 08:01 geekosaur joined 08:13 khagan joined
psch i've got this gist.github.com/peschwa/32ef0f291c...bb82b06b65 from running the first example here github.com/Perl6-Noise-Gang/perl6-...-MIDI-Note 09:21
is that sufficient for any kind of hint re: specific diagnostics? :)
jnthn psch: Well, there's the usual "did you try it under valgrind" hint :-) 09:28
psch okay, i'll do that 09:29
jnthn psch: But it looks like a SEGV inside of the native code called from Perl 6, which almost always means it's mis-use of NativeCall rather than a bug in MoarVM/NativeCall itself.
psch jnthn: well, i don't really know C, but "mem move" sounds like something that could interfere with moars allocations, from here... :) 09:30
jnthn (Passing an undersized buffer, or the wrong struct, or something)
psch but yeah, if that's not something it does...
also, did valgrind gets miraculously faster..? 'cause running the script with perl6-valgrind-m didn't take noticeably longer than with perl6-m... 09:34
i've added the output to a second file in the gist 09:35
jnthn Lots of C libraries use memcpy/memmove internally, but they also generally play nice with with things the outside world gave them :) 09:36
psch another thing of note might be that Audio::MIDI::Note uses Audio::PortMIDI with (potentially) a lot of 'start { }'s 09:37
using Audio::PortMIDI without any async works fine for long times (like, an hour or so maybe), but using Audio::MIDI::Note often SEGVs in less than a minute or so 09:38
jnthn Those are some incredibly confused stack traces, probably partly things to non-debug builds :) 09:40
The second problem is probably a good clue though
A buffer allocated by Pm_Initialize is overrun by Pm_WriteShort
As in, the latter tries to read past the end 09:41
psch ...not sure how i'd get debug builds for all the libs involved. well, or if that's really necessary even 09:43
probably would have to build them manually i guess
or is a debug enabled moar good enough? that i can do quickly :)
jnthn psch: IMO I'd start by taking a careful audit of how you're calling Pm_Initialize and Pm_WriteShort 09:45
Before looking more more elaborate ways to hunt the problem
Since it looks like a classic "putting too much into a buffer" problem 09:46
psch Pm_Initialize takes no args 09:47
and it gets called exactly once in both applications that use the lib
jnthn Hm 09:49
Is the library threadsafe? 09:50
If you're using it from multiple?
psch ah, no, it isn't :)
jnthn Ah
psch that's probably it then i assume?
jnthn Then it's maybe something like, threads competing to fill a buffer creates a data race on updating the amount of the buffer that's been used or some such. 09:51
Could well be. Do you structure things carefully so you only ever have a single thread interacting with the library?
psch i didn't make an effort to, no 09:52
jnthn Ah, so they you may well have multiple threads trampling on each other's use of the library
psch yeah, i'd assume so. the example usage has the equivalent of < start { Pm_WriteShort(...) }; Pm_WriteShort > all over itself 09:53
well, plus omitted arg list for the second call too :) 09:54
that'd also easily explain different failure modes i guess
'cause multiple threads using a non-thread safe library doesn't always fail the same time 09:55
jnthn Right
Yeah, threading failures are horrible that way
Does Pm_WriteShort do a lot of work, ooc? 09:56
jnthn has no idea about the library :)
I'm guessing so if you put it in a start...
I can think of a couple of design options that'd work for this
One is to use a channel, and have one thread that calls Pm_WriteShort whenever it receives something to write. 09:57
And the others just send what to write in the channel.
The other is to use a supplier, and emit into that, and have something reacting to it that calls Pm_WriteShort 09:58
psch Pm_WriteShort calls Pm_Write: portmedia.sourceforge.net/portmidi/...c0ab478ae6
high-level i understand it as "shove the buffer over the midi port"
+plus a bit of parsing what kind of midi message it is
jnthn Ah, so it's doing I/O 10:00
Does the sender then await the start?
Does anything? :)
psch nope :S
that'd also break the intended interface 10:01
jnthn Then you probably want the channel approach
Since send on a channel won't block 10:02
So you can get rid of the whole un-awaited start
psch well, every time the user wants to send an event we have to send a corresponding off-event later
that is, playing a note always plays it for a given amount of time
jnthn Where "later" is scheduled using something like Promise.in?
psch no, the start { } calls wraps a sub that calls Pm_WriteShort(on-event); sleep $duration; Pm_WriteShort(off-event) 10:03
jnthn ah
sleep inside a start is a little less than ideal, 'cus sleep is a real call down to sleep, and so blocks a real thread in the pool up 10:04
With my channel suggestion, and avoiding the sleep, you'd do something like: $chan.send($on-event); Promise.in($duration).then({ $chan.send($off-event) }); 10:05
psch so that should turn into Promise.in($dur).then({ $chan.send(off-event) }) i guess?
jnthn heh, you got it :)
psch alright, thanks for the help :)
jnthn :) 10:06
10:32 zakharyas joined 11:27 TimToady joined 12:39 domidumont joined 12:41 domidumont1 joined 14:03 domidumont joined 17:05 domidumont joined 17:06 lizmat joined 19:15 zakharyas joined 19:34 hoelzro joined
nine_ In oplist, what are those two arguments? loadbytecode w(str) r(str) 19:36
nqp::loadbytecode only takes a file name?
jnthn urgh 19:38
I'd not replicate that
I suspect it just evaluates to the name of the loaded file
Which is done for most void ops that might evaluate to something in the QAST -> MAST phase, but a few got mis-ported from the JVM implementation a while back and I apparently missed changing that one. :( 19:39
nine_ It's been that way since it was added apparently 19:40
Ah, now I see it: GET_REG(cur_op, 0).s = filename; 19:41
jnthn Yeah. Just have no w registers in your op :) 19:42
There is one downside to all of this :(
Which is pretty bad.
We currently mmap bytecode files, meaning they're shared between VM instances. 19:43
Which is a really nice memory win for precompiled files.
nine_ but?
Oh you mean, we'll lose that memory win 19:44
jnthn But if you slurp the file into memory in a buffer and then pass part of it off to something to decode it, then we've got it privately.
Yes :(
Which would be quite a pity
nine_ Do we mmap files open()ed by Perl 6 code? 19:45
jnthn Doesn't stop us having an op that No
Doesn't stop us having an op that takes an offset to start looking for bytecode in
nine_ That's what I was aiming at 19:46
jnthn That is, filename + offset
nine_ Then we'd have the race condition again :/ The file could have been replaced between reading the dependency info and the mbc data
jnthn Yeah
nwc10 My understanding (and I am not a security expert here) is that if you want to be secure, you need to be using file handles (or file descriptirs) 19:47
jnthn Wonder if we can expose mmap itself
nwc10 descriptors
nine_ Would have been cool if all files were mmaped and I could have just passed a pointer to the byte code loader
nwc10 never file names
because what the name points to can change
jnthn So we map it once in Perl 6 space into a file handle 19:48
And then pass that file handle off to the op, having read what we want.
And it can figure out what to do from there.
timotimo the good thing is that basically everything can be a file descriptor these days
jnthn nwc10: Yeah, which means not opening by name twice :)
nine_: If you're up fro the moderate yak shave then you could add an nqp::mmap :) 19:49
nine_ Looks like I'm already shaving away anyway...
jnthn (And a loadbytecodefh or so that takes a file handle...)
nine_ What would nqp::mmap return? I.e. how could I then access the file's contents? 19:50
19:51 cognominal joined, Brock joined, mtj_ joined, lizmat joined, colomon joined, Unavowed_ joined, JimmyZ joined, masak joined, vendethiel joined, psch joined
jnthn nine_: A file handle 19:52
Like nqp::open
nine_ Ok...I'll try to implement loadbytecodebuffer first to get warmed up 19:53
jnthn :-)
walk; bbl
nine_ Should I be concerned about perl6 now segfaulting? 20:13
timotimo just mildly 20:19
nine_ I guess I'm missing a step after adding my op? 20:20
jnthn nine_: Where'd you add it?
Before spesh ops?
nine_ yep
jnthn Also did you rebuild perl6_ops.c ?
(In Rakudo) 20:21
nine_ no
jnthn Ah, then it'd be that.
We've a github issue already for fixing the thing that makes that step necesary.
nine_ I was misled by oplist claiming backwards compatibility :) 20:22
jnthn It's actually 'cus perl6_ops.c references spesh ops directly
Which are VM internal
It really needs to resolve them by name or some such 20:23
nine_ So MoarVM tries, but rakudo cheats
jnthn Yeah. NQP suffers no such issues.
And Rakudo only cheats 'cus we didn't get around to providing a non-cheating way.
nine_ Ok, first test run 20:27
Meh...forgot to map the op 20:30
And it even sort of works. Except for the occasional Serialization Error: Unimplemented case of read_ref 20:36
Well I'll just claim this to be a nice start and continue another day. Good night :) 20:43
jnthn 'night, nine_++
timotimo gnite nine :) 21:03
21:34 patrickz joined 21:38 brrt joined
brrt good *, #moarvm 21:40
timotimo yo brrt 21:41
how are you tonight?
brrt \o timotimo
sort of tired, long day
timotimo i'm also quite tired, as i've got a mild case of the flu
brrt have enough brain space left to gather hypotheses for why reframe-jit breaks in pretty much all perl6 code 21:42
timotimo cool! :)
brrt ok, so, bring ''m on
what typically happens in perl6 code that doesn't happen in nqp code
(GC if you're not torturing things) 21:43
i've... not really proven that extops are the thing, but it is unlikely, since i did write a fix
timotimo taking continuations doesn't happen in nqp at all, does it?
brrt eh, oh 21:44
that is a point
damnit, emacs not working with gnome zoom functionality 21:45
timotimo hum
there's some zooming feature in xfce that's really just zooming into a portion of the screen 21:46
brrt yeah, and these things are supposed to follow the cursor 21:48
which they do
but not in emacs
timotimo oh, but not a typing cursor
fair enough; the one xfce has only follows the mouse cursor i believe
brrt oh well 21:49
timotimo accessibility is such a slow-moving, hardly-advanced topic :\ 21:50
brrt aye
oh, some signatures changed 21:53
will check that out tomorrow
22:42 Unavowed joined 23:38 Unavowed_ joined 23:58 flaviusb left