mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 15:41:43 +00:00 
			
		
		
		
	
		
			
	
	
		
			72 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#ifndef Py_INTERNAL_OBJECT_ALLOC_H
							 | 
						||
| 
								 | 
							
								#define Py_INTERNAL_OBJECT_ALLOC_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "pycore_object.h"      // _PyType_HasFeature()
							 | 
						||
| 
								 | 
							
								#include "pycore_pystate.h"     // _PyThreadState_GET()
							 | 
						||
| 
								 | 
							
								#include "pycore_tstate.h"      // _PyThreadStateImpl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef Py_BUILD_CORE
							 | 
						||
| 
								 | 
							
								#  error "this header requires Py_BUILD_CORE define"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef Py_GIL_DISABLED
							 | 
						||
| 
								 | 
							
								static inline mi_heap_t *
							 | 
						||
| 
								 | 
							
								_PyObject_GetAllocationHeap(_PyThreadStateImpl *tstate, PyTypeObject *tp)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct _mimalloc_thread_state *m = &tstate->mimalloc;
							 | 
						||
| 
								 | 
							
								    if (_PyType_HasFeature(tp, Py_TPFLAGS_PREHEADER)) {
							 | 
						||
| 
								 | 
							
								        return &m->heaps[_Py_MIMALLOC_HEAP_GC_PRE];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (_PyType_IS_GC(tp)) {
							 | 
						||
| 
								 | 
							
								        return &m->heaps[_Py_MIMALLOC_HEAP_GC];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        return &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Sets the heap used for PyObject_Malloc(), PyObject_Realloc(), etc. calls in
							 | 
						||
| 
								 | 
							
								// Py_GIL_DISABLED builds. We use different heaps depending on if the object
							 | 
						||
| 
								 | 
							
								// supports GC and if it has a pre-header. We smuggle the choice of heap
							 | 
						||
| 
								 | 
							
								// through the _mimalloc_thread_state. In the default build, this simply
							 | 
						||
| 
								 | 
							
								// calls PyObject_Malloc().
							 | 
						||
| 
								 | 
							
								static inline void *
							 | 
						||
| 
								 | 
							
								_PyObject_MallocWithType(PyTypeObject *tp, size_t size)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifdef Py_GIL_DISABLED
							 | 
						||
| 
								 | 
							
								    _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
							 | 
						||
| 
								 | 
							
								    struct _mimalloc_thread_state *m = &tstate->mimalloc;
							 | 
						||
| 
								 | 
							
								    m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    void *mem = PyObject_Malloc(size);
							 | 
						||
| 
								 | 
							
								#ifdef Py_GIL_DISABLED
							 | 
						||
| 
								 | 
							
								    m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return mem;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static inline void *
							 | 
						||
| 
								 | 
							
								_PyObject_ReallocWithType(PyTypeObject *tp, void *ptr, size_t size)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#ifdef Py_GIL_DISABLED
							 | 
						||
| 
								 | 
							
								    _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
							 | 
						||
| 
								 | 
							
								    struct _mimalloc_thread_state *m = &tstate->mimalloc;
							 | 
						||
| 
								 | 
							
								    m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    void *mem = PyObject_Realloc(ptr, size);
							 | 
						||
| 
								 | 
							
								#ifdef Py_GIL_DISABLED
							 | 
						||
| 
								 | 
							
								    m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return mem;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif  // !Py_INTERNAL_OBJECT_ALLOC_H
							 |