opt
/
hc_python
/
lib
/
python3.12
/
site-packages
/
greenlet
/
Go to Home Directory
+
Upload
Create File
root@0UT1S:~$
Execute
By Order of Mr.0UT1S
[DIR] ..
N/A
[DIR] __pycache__
N/A
[DIR] platform
N/A
[DIR] tests
N/A
CObjects.cpp
3.43 KB
Rename
Delete
PyGreenlet.cpp
22.89 KB
Rename
Delete
PyGreenlet.hpp
1.43 KB
Rename
Delete
PyGreenletUnswitchable.cpp
4.27 KB
Rename
Delete
PyModule.cpp
8.39 KB
Rename
Delete
TBrokenGreenlet.cpp
1021 bytes
Rename
Delete
TExceptionState.cpp
1.33 KB
Rename
Delete
TGreenlet.cpp
25.13 KB
Rename
Delete
TGreenlet.hpp
27.22 KB
Rename
Delete
TGreenletGlobals.cpp
3.19 KB
Rename
Delete
TMainGreenlet.cpp
3.20 KB
Rename
Delete
TPythonState.cpp
15.00 KB
Rename
Delete
TStackState.cpp
7.21 KB
Rename
Delete
TThreadState.hpp
18.68 KB
Rename
Delete
TThreadStateCreator.hpp
2.55 KB
Rename
Delete
TThreadStateDestroy.cpp
9.34 KB
Rename
Delete
TUserGreenlet.cpp
23.00 KB
Rename
Delete
__init__.py
1.68 KB
Rename
Delete
_greenlet.cpython-312-x86_64-linux-gnu.so
1.36 MB
Rename
Delete
greenlet.cpp
10.74 KB
Rename
Delete
greenlet.h
4.64 KB
Rename
Delete
greenlet_allocator.hpp
1.54 KB
Rename
Delete
greenlet_compiler_compat.hpp
4.24 KB
Rename
Delete
greenlet_cpython_add_pending.hpp
5.90 KB
Rename
Delete
greenlet_cpython_compat.hpp
3.87 KB
Rename
Delete
greenlet_exceptions.hpp
4.40 KB
Rename
Delete
greenlet_internal.hpp
2.65 KB
Rename
Delete
greenlet_refs.hpp
33.63 KB
Rename
Delete
greenlet_slp_switch.hpp
3.12 KB
Rename
Delete
greenlet_thread_support.hpp
867 bytes
Rename
Delete
slp_platformselect.h
3.75 KB
Rename
Delete
/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ /** * Implementation of GreenletGlobals. * * Format with: * clang-format -i --style=file src/greenlet/greenlet.c * * * Fix missing braces with: * clang-tidy src/greenlet/greenlet.c -fix -checks="readability-braces-around-statements" */ #ifndef T_GREENLET_GLOBALS #define T_GREENLET_GLOBALS #include "greenlet_refs.hpp" #include "greenlet_exceptions.hpp" #include "greenlet_thread_support.hpp" #include "greenlet_internal.hpp" namespace greenlet { // This encapsulates what were previously module global "constants" // established at init time. // This is a step towards Python3 style module state that allows // reloading. // // In an earlier iteration of this code, we used placement new to be // able to allocate this object statically still, so that references // to its members don't incur an extra pointer indirection. // But under some scenarios, that could result in crashes at // shutdown because apparently the destructor was getting run twice? class GreenletGlobals { public: const greenlet::refs::ImmortalEventName event_switch; const greenlet::refs::ImmortalEventName event_throw; const greenlet::refs::ImmortalException PyExc_GreenletError; const greenlet::refs::ImmortalException PyExc_GreenletExit; const greenlet::refs::ImmortalObject empty_tuple; const greenlet::refs::ImmortalObject empty_dict; const greenlet::refs::ImmortalString str_run; Mutex* const thread_states_to_destroy_lock; greenlet::cleanup_queue_t thread_states_to_destroy; GreenletGlobals() : event_switch("switch"), event_throw("throw"), PyExc_GreenletError("greenlet.error"), PyExc_GreenletExit("greenlet.GreenletExit", PyExc_BaseException), empty_tuple(Require(PyTuple_New(0))), empty_dict(Require(PyDict_New())), str_run("run"), thread_states_to_destroy_lock(new Mutex()) {} ~GreenletGlobals() { // This object is (currently) effectively immortal, and not // just because of those placement new tricks; if we try to // deallocate the static object we allocated, and overwrote, // we would be doing so at C++ teardown time, which is after // the final Python GIL is released, and we can't use the API // then. // (The members will still be destructed, but they also don't // do any deallocation.) } void queue_to_destroy(ThreadState* ts) const { // we're currently accessed through a static const object, // implicitly marking our members as const, so code can't just // call push_back (or pop_back) without casting away the // const. // // Do that for callers. greenlet::cleanup_queue_t& q = const_cast<greenlet::cleanup_queue_t&>(this->thread_states_to_destroy); q.push_back(ts); } ThreadState* take_next_to_destroy() const { greenlet::cleanup_queue_t& q = const_cast<greenlet::cleanup_queue_t&>(this->thread_states_to_destroy); ThreadState* result = q.back(); q.pop_back(); return result; } }; }; // namespace greenlet static const greenlet::GreenletGlobals* mod_globs; #endif // T_GREENLET_GLOBALS
Save