[Python-Dev] PEP 509: Add a private version to dict
Yury Selivanov
yselivanov.ml at gmail.com
Wed Jan 20 15:27:12 EST 2016
On 2016-01-20 2:45 PM, Glenn Linderman wrote:
> For the reuse case, can't you simply keep the ma_version "live" in
> dict items on the free list, rather than starting over at (presumably)
> 0 ? Then if the dict is reused, it bumps the ma_version, and the
> fallback code goes on with (presumably) relocating the original dict
> (oops, it's gone), and dealing with the fallout.
Not all dicts are created from a freelist, and not all dicts go to the
freelist when they are GCed.
You still can have this situation:
- dict "A" is used as f_locals for a frame, its ma_version is set to X
- dict "A" is GCed, but the freelist is full, so it's just freed
- after a while, you call the code object, a new dict "B" is allocated
with malloc (since now the freelist happens to be empty) for f_locals
- it happens that "B" is allocated where "A" was, and its ma_version
happens to be X by an accident
>
> Then you can use the regular dict id as the globally unique dict id?
> And only need the one uint64, rather than a separately allocated extra
> pair of uint64?
In my design only namespace dicts will have a non-NULL ma_extra, which
means that only a fraction of dicts will actually have a separated pair
of uint64s.
I think that we should either use one global ma_version (as Maciej
suggested) or ma_extra, as it gives more flexibility for us to extend
dicts in the future.
A global (shared between all dicts) unit64 ma_version is actually quite
reliable -- if a program does 1,000,000 dict modifications per second,
it would take it 600,000 years till wrap-around.
Yury
More information about the Python-Dev
mailing list