[Python-Dev] PyWeakref_GetObject() borrows its reference from... whom? (original) (raw)
Chris Angelico rosuav at gmail.com
Mon Oct 10 17:38:04 EDT 2016
- Previous message (by thread): [Python-Dev] PyWeakref_GetObject() borrows its reference from... whom?
- Next message (by thread): [Python-Dev] Playing games with reference counts (was Re: PyWeakref_GetObject() borrows its reference from... whom?)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Tue, Oct 11, 2016 at 8:14 AM, Larry Hastings <larry at hastings.org> wrote:
But I don't think this fixes the problem. Consider:
Thread A calls Q = PyListGetItem(L, 0), which returns a borrowed reference. Thread A then gets suspended, before it has a chance to PyINCREF(Q). Thread B does L.clear(), the reference count of Q goes to 0, Q is added to the doomed objects list. Thread A gets to run again. It does PyINCREF(Q); Q's refcount is now back up to 1, as if Q had been resurrected. At some point in the future the "memory deallocation lock" is released and Q is deleted. If you say "well, just look at the reference count, and if it's 1 throw it off the doomed objects list", keep in mind that I no longer have accurate real-time reference counts. These hacks where we play games with the reference count are mostly removed in my branch.
That's exactly what I would have said, because I was assuming that refcounts would be accurate. I'm not sure what you mean by "play games with", but it sounds like you have a much more sophisticated system going on than I had in my head, and you'll need a correspondingly sophisticated solution to this problem.
Like I said, others have thought a LOT more about this than I have.
ChrisA
- Previous message (by thread): [Python-Dev] PyWeakref_GetObject() borrows its reference from... whom?
- Next message (by thread): [Python-Dev] Playing games with reference counts (was Re: PyWeakref_GetObject() borrows its reference from... whom?)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]