X7ROOT File Manager
Current Path:
/opt/hc_python/lib/python3.12/site-packages/greenlet
opt
/
hc_python
/
lib
/
python3.12
/
site-packages
/
greenlet
/
??
..
??
CObjects.cpp
(3.43 KB)
??
PyGreenlet.cpp
(23.63 KB)
??
PyGreenlet.hpp
(1.43 KB)
??
PyGreenletUnswitchable.cpp
(4.27 KB)
??
PyModule.cpp
(8.39 KB)
??
TBrokenGreenlet.cpp
(1021 B)
??
TExceptionState.cpp
(1.33 KB)
??
TGreenlet.cpp
(25.13 KB)
??
TGreenlet.hpp
(27.85 KB)
??
TGreenletGlobals.cpp
(3.19 KB)
??
TMainGreenlet.cpp
(3.2 KB)
??
TPythonState.cpp
(15.6 KB)
??
TStackState.cpp
(7.21 KB)
??
TThreadState.hpp
(18.68 KB)
??
TThreadStateCreator.hpp
(2.55 KB)
??
TThreadStateDestroy.cpp
(7.98 KB)
??
TUserGreenlet.cpp
(23 KB)
??
__init__.py
(1.68 KB)
??
__pycache__
??
_greenlet.cpython-312-x86_64-linux-gnu.so
(1.38 MB)
??
greenlet.cpp
(10.74 KB)
??
greenlet.h
(4.64 KB)
??
greenlet_allocator.hpp
(2.55 KB)
??
greenlet_compiler_compat.hpp
(4.24 KB)
??
greenlet_cpython_compat.hpp
(4.05 KB)
??
greenlet_exceptions.hpp
(4.4 KB)
??
greenlet_internal.hpp
(2.65 KB)
??
greenlet_msvc_compat.hpp
(2.91 KB)
??
greenlet_refs.hpp
(33.63 KB)
??
greenlet_slp_switch.hpp
(3.12 KB)
??
greenlet_thread_support.hpp
(867 B)
??
platform
??
slp_platformselect.h
(3.87 KB)
??
tests
Editing: greenlet_allocator.hpp
#ifndef GREENLET_ALLOCATOR_HPP #define GREENLET_ALLOCATOR_HPP #define PY_SSIZE_T_CLEAN #include <Python.h> #include <memory> #include "greenlet_compiler_compat.hpp" #include "greenlet_cpython_compat.hpp" namespace greenlet { #if defined(Py_GIL_DISABLED) // Python on free threaded builds says this // (https://docs.python.org/3/howto/free-threading-extensions.html#memory-allocation-apis): // // For thread-safety, the free-threaded build requires that only // Python objects are allocated using the object domain, and that all // Python object are allocated using that domain. // // This turns out to be important because the GC implementation on // free threaded Python uses internal mimalloc APIs to find allocated // objects. If we allocate non-PyObject objects using that API, then // Bad Things could happen, including crashes and improper results. // So in that case, we revert to standard C++ allocation. template <class T> struct PythonAllocator : public std::allocator<T> { // This member is deprecated in C++17 and removed in C++20 template< class U > struct rebind { typedef PythonAllocator<U> other; }; }; #else // This allocator is stateless; all instances are identical. // It can *ONLY* be used when we're sure we're holding the GIL // (Python's allocators require the GIL). template <class T> struct PythonAllocator : public std::allocator<T> { PythonAllocator(const PythonAllocator& UNUSED(other)) : std::allocator<T>() { } PythonAllocator(const std::allocator<T> other) : std::allocator<T>(other) {} template <class U> PythonAllocator(const std::allocator<U>& other) : std::allocator<T>(other) { } PythonAllocator() : std::allocator<T>() {} T* allocate(size_t number_objects, const void* UNUSED(hint)=0) { void* p; if (number_objects == 1) p = PyObject_Malloc(sizeof(T)); else p = PyMem_Malloc(sizeof(T) * number_objects); return static_cast<T*>(p); } void deallocate(T* t, size_t n) { void* p = t; if (n == 1) { PyObject_Free(p); } else PyMem_Free(p); } // This member is deprecated in C++17 and removed in C++20 template< class U > struct rebind { typedef PythonAllocator<U> other; }; }; #endif // allocator type } #endif
Upload File
Create Folder