in reply to Re^4: Tracking down an Lvalue bug?
in thread Tracking down an Lvalue bug?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: Tracking down an Lvalue bug?
by BrowserUk (Patriarch) on Mar 20, 2012 at 06:10 UTC | |
Related to ref to read-only alias ... why?? I don't think so. This demonstrates the problem (bug):
Watch the process memory with ProcessManager:
I suspect it is a result of this "fix". But I believe that fix is wrong, and that the original bug is spurious. (At least in part.) If you do this:
No one is surprised that (the memory allocated to) $string persists beyond the block. Why should this be any different:
In this case -- when the string goes out of scope -- I could make arguments for 3 possible outcomes:
Of the three, I'd prefer C, but would find A completely in keeping with Perl's philosophy. Duplicating the referenced memory of every lvalue ref and the having to copy it back each time it is modified -- just to cover off a really obscure scenario that is at worst, only mildly anomalous -- is crazy. With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] [select] |
by tye (Sage) on Mar 20, 2012 at 14:05 UTC | |
For what its worth, I concur. - tye | [reply] |
by ikegami (Patriarch) on Mar 21, 2012 at 01:30 UTC | |
The fix has no effect on:
The fix is for:
All the patch does (or is suppose to do) is avoid saving the SV inside of the OP, something that causes $string until the end of the program in the second snippet. Do you have a way of automating the test so I can use git bisect to find when the behaviour changed (if it did). | [reply] [d/l] [select] |
by BrowserUk (Patriarch) on Mar 21, 2012 at 01:56 UTC | |
Do you have a way of automating the test Is a windows solution suitable? With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
by ikegami (Patriarch) on Mar 21, 2012 at 02:01 UTC | |
by BrowserUk (Patriarch) on Mar 21, 2012 at 02:32 UTC | |
by ikegami (Patriarch) on Mar 21, 2012 at 03:35 UTC | |
The patches for RT#67838 are is found in:
I ran your test program with ActivePerl 5.14.0 (32 bit) on Windows, and noticed NO memory increase. (Steady at 99MB.) In fact, I saw in increases only up to that version of Perl.
There will be a memory increase if you read the string $$r, but that's how magic works in Perl. I looked at the source code at the time of the patch. There is no intentional "prefetching", and testing shows no accidental prefetching:
In contrast with a version that does grow as soon as substr is called:
Neither $ref nor $$ref ever refer directly to $string's PV. They can't because the address of $string's buffer can change as $string changes.
$$ref does have a reference to $string.
Actually, that's easy. Just weaken $$ref's reference to $string.
One can't free the start of a memory block. I don't think one can even free the end of a memory block. The string would have to be copied to a new buffer in order to shrink the buffer. Doable, but it would require a temporary "doubling" of memory. It would also be uncharacteristic of Perl. Perl intentially avoids freeing memory left and right. Shrinking a buffer would be a first! | [reply] [d/l] [select] |
by BrowserUk (Patriarch) on Mar 23, 2012 at 01:14 UTC | |
ActivePerl 5.14.0 (32 bit) on Windows Confirming that the behaviour is also changed on 64-bit 5.14 for windows. There will be a memory increase if you read the string $$r, but that's how magic works in Perl. I accept that is how it currently works, but question whether is should or has to work that way. If the reference is only ever used for reading, duplicating the reference memory is a complete waste of time (cpu & memory). At the very least it should be possible to defer the duplication until a mutating operation is performed upon it. Even then, I question whether it is necessary to duplicate the substring, and then copy the modified version back over the original. If a temporary SV* (be it a TARG or LVTARG or just a mortal SV* created for the purpose) was initialised so that its PV pointed directly at the original strings PV buffer, and it used the OOK trick, CUR & LEN to make that temporary SV* point to just the referenced substring in-place. And then that temp SV was passed to the mutating operator, everything should work as it would with a normal SV. When the mutating operator completes, the PUT magic gets control and can fix up the original (referenced) Sv to reflect any changes. But, I am aware that this is the kind of thing we could argue back forth, round & round and down a dozen blind alleys and never reach a conclusion. The only way to avoid that is to prove my theory. And that is going to take time. I'm also currently working on a machine that has a dodgy motherboard and an increasingly frequent habit of blue screening at the slightest provocation. I have a new motherboard and ram on its way, but till then, I'm not getting into anything deep because of the risk of loosing code though random failures. So bear with me. I'll either come back with proof of concept code or an acknowledgement that I couldn't make it work. With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |