mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Use critical sections to lock around accesses to cell contents. The critical sections are no-ops in the default (with GIL) build.
		
			
				
	
	
		
			48 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			1 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 */
 |