Re: sip: Accessing members results in incorrect/missing data

MatthijsBurgh <[email protected]>
Newsgroups gmane.comp.python.pyqt-pykde
Message-ID <[email protected]>
Phil Thompson-5 wrote
> On 21/01/2020 17:50, Phil Thompson wrote:
>> On 16/01/2020 20:52, MatthijsBurgh wrote:
>>> I have done some more investigating.
>>> 
>>> As mentioned 
>>> https://github.com/orocos/orocos_kinematics_dynamics/issues/41,
>>> problems where occuring in with SIP 4.13.2.
>>> 
>>> Which is explainable as you fixed this issue in the commit:
>>> https://www.riverbankcomputing.com/hg/sip/rev/0dd3cb4eff0e. This makes 
>>> sure
>>> the member variable contains a reference to the containing class. This
>>> prevents the class from being garbage collected while there are still
>>> references to the member variable.
>>> 
>>> You apply a fix to this in commit
>>> https://www.riverbankcomputing.com/hg/sip/rev/fbb9cdbad791.
>>> 
>>> The commit, 
>>> https://www.riverbankcomputing.com/hg/sip/rev/11a92ebd4840,
>>> which I also mentioned in my first message, is the important one.
>>> 
>>> In this commit you introduce a kind of caching for member variables. 
>>> The
>>> python wrapper of the members of a class are stored in a dict in the 
>>> python
>>> wrapper of the class. To add the member to the cache, you use
>>> "sipKeepReference(sipPySelf, %d, sipPy)". So the class contains a 
>>> reference
>>> to the member variable.
>>> 
>>> While previously "sipKeepReference(sipPy, -1, sipPySelf)", was used to 
>>> store
>>> the reference to the class in the dict of the member variable. Focus 
>>> here on
>>> the switch of "sipPy" and "sipPySelf". So by the last commit, 
>>> 11a92ebd4840,
>>> you added a new feature, but you broke another one.
>>> 
>>> I suggest to restore the feature which stores the reference to the 
>>> class in
>>> the member variable dict.
>>> 
>>> I did some testing in 4.19.20. I didn't experience a significant 
>>> performance
>>> increase with the caching with my Frame object and its member p, a 
>>> vector
>>> with 3 variables. (I tweaked the code,
>>> https://www.riverbankcomputing.com/hg/sip/file/7c54145e55b6/sipgen/gencode.c#l4904,
>>> to always get the caching.)
>>> Also I added manually the "sipKeepReference(sipPy, -1, sipPySelf)" to 
>>> the
>>> generated cpp for the class reference. When both features were used at 
>>> the
>>> same time, the "release" function of the class was not called. (I 
>>> added a
>>> "printf" to it, which didn't show in that situation, but did if just 
>>> of the
>>> two was used.)
>> 
>> Thanks for the analysis, that was very helpful.
>> 
>> This changeset is also a problem...
>> 
>> https://www.riverbankcomputing.com/hg/sip/rev/6ec87337d5e2
>> 
>> Can you try the latest version of the 4.19-maint branch, ie. including
>> this changeset...
>> 
>> https://www.riverbankcomputing.com/hg/sip/rev/137b9be794a1
>> 
>> ...and let me know how you get on.
> 
> There is now a newer changeset...
> 
> https://www.riverbankcomputing.com/hg/sip/rev/6a057b2d8537
> 
> Phil
> _______________________________________________
> PyQt mailing list    

> PyQt@

> https://www.riverbankcomputing.com/mailman/listinfo/pyqt

The first changeset already fixed the issue.

The newer changeset creates the situation as desribed in
http://python.6.x6.nabble.com/sip-Accessing-members-results-in-incorrect-missing-data-tp5266521p5266740.html,
it looks like the release function isn't called anymore. I thought Python GC
was able to break up circular references, but it looks like it isn't
happening.

By running the following code:
```
v = Vector(1,2,3)
R = Rotation()
F = Frame(R,v)
v2 = F.p
v3 = Frame(F).p
v3 = Vector(2,3,4)
```
The `release_Frame` is called(print shows up) after the second `v3`
assignment when using your first changeset, but the print doesn't show up
with your second changeset, today's one.

So to me it looks like this will cause a memory leak.

Side note: I would prefer the usage of a specific key for the member
reference to the containing class.
I don't think using the same key for both references will cause a problem
with overwriting. As a class can't contain a member of the same type, only a
member as a pointer to the same type. In which case, the reference isn't
kept, if I understand the code correct.

Matthijs



--
Sent from: http://python.6.x6.nabble.com/PyQt-f1792048.html
_______________________________________________
PyQt mailing list    [email protected]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.