00:15 evalable6 joined 00:32 P6Bot joined
MasterDuke any idea why the conditional here github.com/MoarVM/MoarVM/blame/mas...#L265-L266 is `>=`, not `>`? 00:51
samcv MasterDuke, becuase we want to resize before we run out 00:58
if it was > then we'd already be overrunning the buffer
MasterDuke but if it's equal, we're just resizing to the same size 00:59
samcv hmm i see your point 01:00
geekosaur ^
MasterDuke geekosaur: ?
01:01 P6Bot joined
geekosaur echoing your point 01:02
(I did look at the paste_
MasterDuke ah, ok
01:29 P6Bot joined 01:34 committable6 joined 01:36 committable6 joined 01:37 bisectable6 joined 01:40 bisectable6 joined 01:54 ilbot3 joined 01:56 synopsebot joined
MasterDuke right, Geth is down: github.com/MoarVM/MoarVM/pull/710 02:01
02:04 synopsebot joined
samcv MasterDuke, merged 02:05
MasterDuke cool, thanks 02:06
02:08 unicodable6 joined 02:28 Ven`` joined 02:34 vendethiel- joined 03:12 evalable6 joined 03:48 synopsebot joined 03:52 synopsebot joined 04:04 lizmat joined 04:14 Geth joined
samcv i'm working on trying to fix the windows MSVC 2017 build on appveyor 04:54
06:26 domidumont joined 06:30 domidumont joined 09:10 leont joined 09:17 Ven`` joined
timotimo vmprof.readthedocs.io/en/latest/ - maybe i should read all of this carefully 09:37
09:39 evalable6 joined
timotimo there's not much there :| 09:53
10:08 zakharyas joined 10:27 evalable6 joined 10:49 evalable6 joined 11:06 TimToady joined 11:19 synopsebot joined
timotimo jnthn: do you think i should introduce a new piece of MVMIOOps table for file descriptor duping? 11:20
jnthn timotimo: Mebbe...what will it apply to?
timotimo probably only syncfile tbh
jnthn Hm, then maybe not worth putting on the vtable 11:21
timotimo yeah, that was my worry
i'm not sure what it'd mean to dup our async handles, like sockets for example
async sockets, that is
and since we don't turn our sockets into fhs, duping them makes little sense, too
11:29 leont joined
timotimo oh no! 11:34
i didn't realize dup would share file offsets between the old and new file descriptors
that makes it useless for my use case
MasterDuke asan is saying i'm `attempting free on address which was not malloc()-ed` here github.com/MoarVM/MoarVM/blob/mast...oc.c#L220, caused by `buffer = MVM_fixed_size_realloc(tc, tc->instance->fsa, buffer, old_bufsize * sizeof(MVMGrapheme32), count * sizeof(MVMGrapheme32));` in utf8.c's MVM_string_utf8_decode 11:39
timotimo aha
so somehow the flag for FSA usage gets lost
BBL 11:40
MasterDuke i added `result->common.header.flags |= MVM_CF_USES_FSA;` right here: github.com/MoarVM/MoarVM/blob/mast...tf8.c#L191 11:41
timotimo what i'm saying is that something happens that causes the flag to be lost 11:45
MasterDuke hm. how could that happen?
timotimo shrug, i advise you to record the execution with rr, replay it to that point, print the address of the headers, i.e. have it display something like (MVMuint64 *) 0x1212413 and then have gdb "watch *((MVMUint64 *) 0x12312412)" and "reverse-cont" until it displays "changed" 11:46
and see where that leads
gotta go afk 11:47
MasterDuke never actually used rr, but i'll give it a try, thanks
timotimo good luck! 11:48
might be able to join irc on the road, so write if you're in trouble and i'll try to help 11:50
MasterDuke will od
*do
11:55 evalable6 joined
MasterDuke hm. at the time of the realloc, the flags are 4112, which is MVM_CF_USES_FSA + MVM_CF_SECOND_GEN 12:16
the previous change seems to be the `MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type));`, the first line of MVM_string_utf8_decode 12:17
hm, but the flags on result shouldn't matter. buffer, which is what's getting realloced, hasn't been given to result yet 12:25
weird. for debugging purposes, i changed to get a new buffer at the realloc and explicitly free the old one. i now get "Fixed size allocator: wrong size in free" 13:04
but i'm printing the size when it originally gets created, it doesn't get changed anywhere else, and it matches when i'm calling the free 13:05
13:09 evalable6 joined
MasterDuke hm, it always seems to be when the fixed_size_realloc goes to this case: github.com/MoarVM/MoarVM/blob/mast...loc.c#L220 13:31
14:15 zakharyas joined
timotimo MasterDuke: that doesn't have a case for the fsa size debug at all? 14:20
MasterDuke timotimo: right, haven't added that yet 14:22
guess i can look at what the other functions do any try to copy it
timotimo i believe you'll just have to subtract to get the "real" pointer, realloc that, and write the new size 14:23
MasterDuke "real" pointer? 14:28
timotimo yeah, the pointer you get back from the FSA in FSA_SIZE_DEBUG mode is actually a 64bit integer offset from what malloc gave you 14:30
#if FSA_SIZE_DEBUG 14:31
MVMFixedSizeAllocDebug *dbg = (MVMFixedSizeAllocDebug *)((char *)to_free - 8);
that's why fixed_size_free is implemented like that
MasterDuke ah 14:32
oh! 14:33
now it work, i.e., print "hi" and doesn't segv, panic, etc 14:34
i was just doing `perl6 -e 'say "hi"'` 14:35
timotimo good!
that's a test case i also use often :)
MasterDuke ha. it would have worked before if i had turned off FSA_SIZE_DEBUG! 14:37
timotimo yes 14:38
anyway, we can just implement dup based on nativecall and "create io handle from fd" if need be 14:47
MasterDuke looks to have taken 400k instructions off of `perl6 -e ''` 15:01
15:03 leont joined
MasterDuke but trying to build nqp does not go well: *** Error in `/home/dan/Source/perl6/install/bin/moar': munmap_chunk(): invalid pointer: 0x0000555ad9515420 *** 15:04
timotimo 400k instructions out of how many? 15:06
MasterDuke 600million
timotimo hah.
still not bad 15:07
i should have checked what difference it made when i gave the NFA FSA alloc
MasterDuke timotimo: know anything about that error above? 15:17
ugexe i think the lta stuff may have fixed segfaults from `while 1 { my $a := gather { take 1 }; for 0 { await start { $a[0] }, start { $a[0] } } }`
er FSA
timotimo i can only imagine out of bounds write or passing a non-malloced pointer to free or something 15:18
15:32 synopsebot joined
MasterDuke is this just a quick way to create an empty MVMString? github.com/MoarVM/MoarVM/blob/mast...ump.c#L332 15:49
jnthn There's a constant one handing off the MVMInstance
tc->instance->str_consts.empty or so
*hanging
MasterDuke "name" (created at the line i linked) is only used here: github.com/MoarVM/MoarVM/blob/mast...#L398-L400 15:50
if i understand what's going on, name is created as just "", then gets some other stuff stuck in it, just so it can be MVM_string_utf8_encode_C_string()ed 15:52
16:12 domidumont joined 16:15 timo joined
timotimo ah dang, i'm using buffered input so i'm not going to get good results for tell, right? 16:16
not only that, but it also apparently reads in a whole megabyte at a time 16:17
jnthn Yeah but method tell in Rakudo compensates for that by subtracting off the number of bytes in the decoder 16:23
timotimo oh, nice 16:25
the reason i wasn't seeing anything but 0 for tell was i was using $*IN rather than $*ARGFILES 16:29
17:01 evalable6 joined 17:30 timo joined
Zoffix "Upgrade done (0.58 seconds)" that was too fast :/ 17:31
Guest59997 upgrade of what?
Zoffix wc
Geth MoarVM: MasterDuke17++ created pull request #711:
Support FSA_SIZE_DEBUG in MVM_fixed_size_realloc
timotimo MasterDuke: i believe fixed_size_realloc_at_safepoint needs a bit of code, too 17:32
MasterDuke: right now it won't update the size, so when the realloced thing gets freed later on it'll still think it's the same size as before ... only when it's the same bin, of course 17:33
MasterDuke what i added to MVM_fixed_size_realloc won't update the size? 17:35
timotimo fixed_size_realloc_at_safepoint doesn't use fixed_size_realloc 17:37
MasterDuke right, i just added the same code to it 17:38
timotimo i think the code for fixed_size_realloc looks correct
under what circumstances do we still use malloc for string memory? 17:39
MasterDuke on master? or the branch i'm working on? 17:40
timotimo your branch 17:41
oh, hm, i wouldn't do realloc_at_safepoint like that
MasterDuke lots of things i think
oh? 17:42
timotimo i think it ought to only do the code you just added if old_bin == new_bin
otherwise it'll behave differently
and then i'd really just call into realloc from the old_bin == new_bin branch
because that'll be the same code then
MasterDuke move the #if into the old_bin == new_bin branch? 17:44
17:44 releasable6 joined
timotimo aye 17:45
er, wait, i misspoke
oh, no, it was correct after all 17:46
i was about to say "no need to actually MVM_realloc if the bin is the same", but with FSA_SIZE_DEBUG the allocation is actually exact, so we can't re-use the pointer unless the sizes exactly match
MasterDuke so both commits in the PR are good as they stand now? 17:49
timotimo nah, i'd still want the safepoint code moved into the old_bin == new_bin 17:50
MasterDuke i don't understand why 17:51
timotimo because realloc_at_safepoint is there so if the pointer changes, code that's still got the old pointer around doesn't read from or write to just-freed memory 17:53
and the FSA_SIZE_DEBUG version of realloc_at_safepoint will now invalidate existing pointers every time 17:54
hm, wait, that means it can't do the shortcut at all and would have to go through the full alloc + memcpy + free dance
unless the sizes exactly match 17:55
OK, i gotta go afk for a bit, but i think the way i've described it now should be correct
MasterDuke so i should move the at_safepoint debug code inside the new == old branch? 17:56
18:01 quotable6 joined 18:25 evalable6 joined 18:34 Zoffix joined 18:47 Zoffix joined
timotimo nah, i think it needs to always do the old_bin != new_bin branch if debug is on 18:56
MasterDuke with a fixed_size_alloc, or regular MVM_malloc? 19:00
timotimo if you call into fixed_size_alloc and free_at_safepoint it'll do the pointer calculations for you 19:01
MasterDuke timotimo: gist.github.com/MasterDuke17/e66c3...4647801f49 ? 19:08
19:42 geekosaur joined
timotimo i think that looks good 19:42
MasterDuke k, i'll correct the second commit in the PR to that 19:43
updated 19:48
ugh. now i'm getting `MoarVM panic: Fixed size allocator: wrong size in free, expected 256, got 232`, but it looks right at the calling site 19:52
19:53 synopsebot joined
MasterDuke i may need to back out a whole bunch of changes and start nearly over 19:53
21:02 geekosaur joined
timotimo damn 21:06
MasterDuke: what do i have to do to make it break on my end? 21:14
are you running it with asan or with valgrind?
samcv MasterDuke, why are there so many issues you're having with freeing a different amount than you allocated? any specific things going on? 21:15
timotimo src/core/fixedsizealloc.c:234:27: error: pointer of type ???void *??? used in arithmetic [-Werror=pointer-arith] 21:17
i wonder why it only blows up on my end
21:19 Ven`` joined
timotimo omg could asan please stop reporting leaks unless i tell it not to 21:24
samcv there is a compile option iirc 21:30
MasterDuke timotimo: make it break? 21:31
timotimo yeah, why do you get that panic?
MasterDuke i turned FSA_SIZE_DEBUG on
samcv: just making a bunch of changes kind of all over 21:32
timotimo i just built all of rakudo with FSA_SIZE_DEBUG on and also asan 21:33
MasterDuke heh. i guess that's good confirmation that it must be something i've done wrong
fwiw, this is my branch with current changes, it's mostly a bunch of random commits to save progress. github.com/MasterDuke17/MoarVM/tre...ng_storage 21:34
timotimo i merge that into the fsa_size_debug support branch? 21:35
MasterDuke i think i cherry picked changes out for the fsa_size_debug branch
so should just merge into master 21:36
gist.github.com/MasterDuke17/f5d17...cf0c5f543, the panic i get when trying to build nqp
timotimo ah, so very early into building nqp?
MasterDuke yep, first thing maybe 21:37
timotimo aye
i shall have a little look
MasterDuke part of the overall problem is that i didn't have much of a plan for how to go about this 21:38
i think i start while on a flight and have been working on it piecemeal
timotimo oh wow. i wondered why my arm's kinda itchy
turn it around, see rather large scratch marks from the cat 21:39
MasterDuke heh. i was wondering if my changes were so bad as to cause an allergic reaction on sight
can't blame the cat on me
timotimo i have alloc_size of 256 but free size of 50106 21:41
that could be interesting
MasterDuke oh, this is the specific line that's a problem right now: MVM_fixed_size_free(tc, tc->instance->fsa, cur_chars->length * sizeof(MVMGrapheme32), cur_chars->chars);
timotimo right 21:42
except it's length without cur_chars locally
MasterDuke right, but then you get a gigantic value 21:43
timotimo i don't think this is the right pointer to be freeing at all 21:44
i mean up above you're allocating result->body.storage.blob_32 21:45
but then the same length was used to free cur_chars->chars
which i'm not sure is fsa allocated?
MasterDuke it is/was/might be
timotimo er 21:47
doesn't free_chars actually already to that exact free action?
oh, no, free_chars frees the "outer" thing instead 21:48
but why does that free the chars pointer with the chars->length? that doesn't seem right to me
i think that must instead have a length of, like, sizeof(MVMDecodeStreamChars) to free 21:49
MasterDuke i've definitely confused myself many times with this bunch of code
the one at 470?
timotimo no, the one in free_chars 21:50
MasterDuke hm, i currently have the free in free_chars unchanged 21:51
timotimo ah, ok, htat's some local changes you have
MasterDuke i did push it 21:52
timotimo other places MVM_free(cur_chars->chars)
so that's what i tried. it's not correct though
oh, ah, utf8_decodestream does fsa allocate that 21:54
MasterDuke this would be so much easier if a normal free required the size also...
timotimo hah. 21:55
MasterDuke i'm not really sure why what i have now is wrong. if i'm freeing cur_chars->chars, cur_chars->length * sizeof(MVMGrapheme32) should be its size 21:56
timotimo hm. it should be possible with a little macro to tell valgrind to spit out all it knows about a given pointer 21:59
MasterDuke oh. maybe need to add ds->chars_head_pos 22:07
timotimo isn't that the distance from the cur_chars->chars to the actual position we'd be inserting to/reading from? 22:08
MasterDuke damn you and your unassailable logic! 22:10
timotimo not sure about it, i haven't looked closely at all :|
but i found a thing i can tell valgrind to give me info about a pointer
MasterDuke oh? 22:11
timotimo the valgrind docs are hair-pulling :| 22:12
i KNOW i saw the thing i needed a few seconds ago 22:13
perfect.
22:24 evalable6 joined
timotimo let's see if it did anything at all 22:25
now to screw up some size somewhere to see if it works 22:27
oh my gosh i think it worked 22:31
gist.github.com/timo/f6f84c4e6e48e...9241233d96 - MasterDuke how do you like this? 22:32
MasterDuke that's a very large len? 22:34
timotimo only 2x as much as was intended i think
whoops 22:35
i gave the pointer instead of the size there
good catch
MasterDuke hope you figure something out, probably gotta afk for a bit 22:38
timotimo .o( what exactly was i doing ) 22:41
fantastic, now i get not only the backtrace of where the thing was allocated, but also the backtrace of where the wrong free size was passed 22:46
i don't really understand why the cur_chars->length isn't the right size to free the cur_chars->chars with 22:53
MasterDuke i know! 22:54
bug? 22:55
timotimo it goes via decodestream_add_chars, which takes the length that was used to set up the buffer, too
oh here's another spot where the size isn't multiplied by the grapheme size
inside utf8.c, in the UTF8_REJECT branch 22:56
bufsize doesn't get mutated anywhere i'd see? :\
MasterDuke in my changes?
timotimo well, i have two of your branches merged :) 22:57
anyway, it doesn't crash any more now that i made it VALGRIND_PRINTF_BACKTRACE instead of MVM_panic ... and it finishes running 22:58
somehow it only trips over this once during that first compile
MasterDuke i fixed that, so you've got some older commits 22:59
timotimo ah
MasterDuke huh, so it build nqp?
timotimo oh, no
only the very first file
i have to put valgrind in front of the build lines every time ;_;
MasterDuke ha 23:00
timotimo MoarVM panic: Fixed size allocator: wrong size in free: expected 256, got 156 23:01
that's one of the later files
i'm going to look through what each file has to see what these buffer sizes do 23:02
like, expected 256 is the same number as the very first file
i want to see if it's just a coincidence
MasterDuke yep 23:03
timotimo ho-hum. 23:05
oh, well, what if it saves the actual number of characters that got into the buffer as length
not the size of the buffer
which makes a lot of sense
except it passes bufsize to add_chars, and not count 23:06
yeah, no, i don't know 23:08
but i'll get this valgrind stuff upstream
MasterDuke cool
timotimo aha! 23:10
after the "done:" label in utf8
there it uses count instead of bufsize
so we either put a bufsize into the struct so we can properly free, or we stick with malloc and free 23:11
MasterDuke hm 23:13
23:26 Ven`` joined