mirror of
https://github.com/python/cpython.git
synced 2024-11-24 17:47:13 +01:00
19c1dd60c5
Use critical sections to lock around accesses to cell contents. The critical sections are no-ops in the default (with GIL) build.
49 lines
1.0 KiB
C
49 lines
1.0 KiB
C
#ifndef Py_INTERNAL_CELL_H
|
|
#define Py_INTERNAL_CELL_H
|
|
|
|
#include "pycore_critical_section.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
// Sets the cell contents to `value` and return previous contents. Steals a
|
|
// reference to `value`.
|
|
static inline PyObject *
|
|
PyCell_SwapTakeRef(PyCellObject *cell, PyObject *value)
|
|
{
|
|
PyObject *old_value;
|
|
Py_BEGIN_CRITICAL_SECTION(cell);
|
|
old_value = cell->ob_ref;
|
|
cell->ob_ref = value;
|
|
Py_END_CRITICAL_SECTION();
|
|
return old_value;
|
|
}
|
|
|
|
static inline void
|
|
PyCell_SetTakeRef(PyCellObject *cell, PyObject *value)
|
|
{
|
|
PyObject *old_value = PyCell_SwapTakeRef(cell, value);
|
|
Py_XDECREF(old_value);
|
|
}
|
|
|
|
// Gets the cell contents. Returns a new reference.
|
|
static inline PyObject *
|
|
PyCell_GetRef(PyCellObject *cell)
|
|
{
|
|
PyObject *res;
|
|
Py_BEGIN_CRITICAL_SECTION(cell);
|
|
res = Py_XNewRef(cell->ob_ref);
|
|
Py_END_CRITICAL_SECTION();
|
|
return res;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_CELL_H */
|