mirror of
https://github.com/python/cpython.git
synced 2026-04-14 15:50:50 +00:00
(cherry picked from commit 5b25eaec37)
Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
75 lines
2.2 KiB
Text
75 lines
2.2 KiB
Text
# Thread safety annotations for C API functions.
|
|
#
|
|
# Each line has the form:
|
|
# function_name : level
|
|
#
|
|
# Where level is one of:
|
|
# incompatible -- not safe even with external locking
|
|
# compatible -- safe if the caller serializes all access with external locks
|
|
# distinct -- safe on distinct objects without external synchronization
|
|
# shared -- safe for concurrent use on the same object
|
|
# atomic -- atomic
|
|
#
|
|
# Lines beginning with '#' are ignored.
|
|
# The function name must match the C domain identifier used in the documentation.
|
|
|
|
# Synchronization primitives (Doc/c-api/synchronization.rst)
|
|
PyMutex_Lock:shared:
|
|
PyMutex_Unlock:shared:
|
|
PyMutex_IsLocked:atomic:
|
|
|
|
# List objects (Doc/c-api/list.rst)
|
|
|
|
# Type checks - read ob_type pointer, always safe
|
|
PyList_Check:atomic:
|
|
PyList_CheckExact:atomic:
|
|
|
|
# Creation - pure allocation, no shared state
|
|
PyList_New:atomic:
|
|
|
|
# Size - uses atomic load on free-threaded builds
|
|
PyList_Size:atomic:
|
|
PyList_GET_SIZE:atomic:
|
|
|
|
# Strong-reference lookup - lock-free with atomic ops
|
|
PyList_GetItemRef:atomic:
|
|
|
|
# Borrowed-reference lookups - no locking; returned borrowed
|
|
# reference is unsafe in free-threaded builds without
|
|
# external synchronization
|
|
PyList_GetItem:compatible:
|
|
PyList_GET_ITEM:compatible:
|
|
|
|
# Single-item mutations - hold per-object lock for duration;
|
|
# appear atomic to lock-free readers
|
|
PyList_SetItem:atomic:
|
|
PyList_Append:atomic:
|
|
|
|
# Insert - protected by per-object critical section; shifts
|
|
# elements so lock-free readers may observe intermediate states
|
|
PyList_Insert:shared:
|
|
|
|
# Initialization macro - no synchronization; normally only used
|
|
# to fill in new lists where there is no previous content
|
|
PyList_SET_ITEM:compatible:
|
|
|
|
# Bulk operations - hold per-object lock for duration
|
|
PyList_GetSlice:atomic:
|
|
PyList_AsTuple:atomic:
|
|
PyList_Clear:atomic:
|
|
|
|
# Reverse - protected by per-object critical section; swaps
|
|
# elements so lock-free readers may observe intermediate states
|
|
PyList_Reverse:shared:
|
|
|
|
# Slice assignment - lock target list; also lock source when it
|
|
# is a list
|
|
PyList_SetSlice:shared:
|
|
|
|
# Sort - per-object lock held; comparison callbacks may execute
|
|
# arbitrary Python code
|
|
PyList_Sort:shared:
|
|
|
|
# Extend - lock target list; also lock source when it is a
|
|
# list, set, or dict
|
|
PyList_Extend:shared:
|