forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pythongh-124218: Refactor per-thread reference counting
Currently, we only use per-thread reference counting for heap type objects and the naming reflects that. In an upcoming change we will extend it to code objects and certain dictionaries used in `PyFunctionObject` to avoid scaling bottlenecks when creating nested functions. Rename some of the files and functions in preparation for this change.
- Loading branch information
Showing
15 changed files
with
168 additions
and
167 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
#ifndef Py_INTERNAL_UNIQUEID_H | ||
#define Py_INTERNAL_UNIQUEID_H | ||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#ifndef Py_BUILD_CORE | ||
# error "this header requires Py_BUILD_CORE define" | ||
#endif | ||
|
||
#ifdef Py_GIL_DISABLED | ||
|
||
// This contains code for allocating and reusing unique object ids, which are | ||
// used to implement per-thread reference counting. | ||
// heap type objects to avoid contention on the reference count fields | ||
// of heap type objects. Static type objects are immortal, so contention | ||
// is not an issue for those types. | ||
// | ||
// An id of -1 is used to indicate that an object doesn't use per-thread | ||
// refcounting. This value is used when a type object is finalized by the GC | ||
// and during interpreter shutdown to allow the type object to be | ||
// deallocated promptly when the object's refcount reaches zero. | ||
// | ||
// Each entry implicitly represents a unique id based on its offset in the | ||
// table. Non-allocated entries form a free-list via the 'next' pointer. | ||
// Allocated entries store the corresponding PyObject. | ||
typedef union _Py_unique_id_entry { | ||
// Points to the next free type id, when part of the freelist | ||
union _Py_unique_id_entry *next; | ||
|
||
// Stores the object when the id is assigned | ||
PyObject *obj; | ||
} _Py_unique_id_entry; | ||
|
||
struct _Py_unique_id_pool { | ||
PyMutex mutex; | ||
|
||
// combined table of object with allocated unique ids and unallocated ids. | ||
_Py_unique_id_entry *table; | ||
|
||
// Next entry to allocate inside 'table' or NULL | ||
_Py_unique_id_entry *freelist; | ||
|
||
// size of 'table' | ||
Py_ssize_t size; | ||
}; | ||
|
||
// Assigns the next id from the pool of ids. | ||
extern Py_ssize_t _PyObject_AssignUniqueId(PyObject *obj); | ||
|
||
// Releases the allocated id back to the pool. | ||
extern void _PyObject_ReleaseUniqueId(Py_ssize_t unique_id); | ||
|
||
// Merges the per-thread reference counts into the corresponding objects. | ||
extern void _PyObject_MergePerThreadRefcounts(_PyThreadStateImpl *tstate); | ||
|
||
// Like _PyObject_MergePerThreadRefcounts, but also frees the per-thread | ||
// array of refcounts. | ||
extern void _PyObject_FinalizePerThreadRefcounts(_PyThreadStateImpl *tstate); | ||
|
||
// Frees the interpreter's pool of type ids. | ||
extern void _PyObject_FinalizeUniqueIdPool(PyInterpreterState *interp); | ||
|
||
// Increfs the type, resizing the per-thread refcount array if necessary. | ||
PyAPI_FUNC(void) _PyType_IncrefSlow(PyHeapTypeObject *type); | ||
|
||
#endif /* Py_GIL_DISABLED */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
#endif /* !Py_INTERNAL_UNIQUEID_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.