16#ifdef THREAD_SIMPLE_IMPL
22ThreadSimpleImpl *
volatile ThreadSimpleImpl::_st_this;
24int ThreadSimpleImpl::_next_unique_id = 1;
30ThreadSimpleImpl(
Thread *parent_obj) :
31 _parent_obj(parent_obj)
33 _unique_id = _next_unique_id;
38 _priority = TP_normal;
39 _priority_weight = 1.0;
45 _context = alloc_thread_context();
50 _manager = ThreadSimpleManager::get_global_ptr();
52#ifdef HAVE_POSIX_THREADS
53 _posix_system_thread_id = (pthread_t)-1;
56 _win32_system_thread_id = 0;
65 if (thread_cat->is_debug()) {
67 <<
"Deleting thread " << _parent_obj->get_name() <<
"\n";
69 nassertv(_status != TS_running);
71 free_thread_context(_context);
73 if (_stack !=
nullptr) {
74 memory_hook->
mmap_free(_stack, _stack_size);
76 _manager->remove_thread(
this);
83void ThreadSimpleImpl::
86 _priority = TP_normal;
87 _priority_weight = _manager->_simple_thread_normal_weight;
89#ifdef HAVE_POSIX_THREADS
90 _posix_system_thread_id = pthread_self();
93 _win32_system_thread_id = GetCurrentThreadId();
96 _manager->set_current_thread(
this);
102bool ThreadSimpleImpl::
103start(ThreadPriority priority,
bool joinable) {
104 if (thread_cat->is_debug()) {
105 thread_cat.debug() <<
"Starting " << *_parent_obj <<
"\n";
108 nassertr(_status == TS_new,
false);
110 nassertr(_stack ==
nullptr,
false);
112 if (needs_stack_prealloc) {
113 _stack = (
unsigned char *)memory_hook->
mmap_alloc(_stack_size,
true);
116 _joinable = joinable;
117 _status = TS_running;
118 _priority = priority;
122 _priority_weight = _manager->_simple_thread_low_weight;
126 _priority_weight = _manager->_simple_thread_normal_weight;
130 _priority_weight = _manager->_simple_thread_high_weight;
134 _priority_weight = _manager->_simple_thread_urgent_weight;
144 _python_state = thread_state_swap(
nullptr);
145 thread_state_swap(_python_state);
148 init_thread_context(_context, _stack, _stack_size, st_begin_thread,
this);
150 _manager->enqueue_ready(
this,
false);
158void ThreadSimpleImpl::
161 if (_status == TS_running) {
162 ThreadSimpleImpl *thread = _manager->get_current_thread();
163 if (thread !=
this) {
164 _joining_threads.push_back(thread);
165 _manager->next_context();
173void ThreadSimpleImpl::
175 _manager->preempt(
this);
181std::string ThreadSimpleImpl::
182get_unique_id()
const {
183 std::ostringstream strm;
185 strm << GetCurrentProcessId();
189 strm <<
"." << _unique_id;
198void ThreadSimpleImpl::
200 ThreadSimpleManager *manager = ThreadSimpleManager::get_global_ptr();
201 manager->prepare_for_exit();
207bool ThreadSimpleImpl::
209 return (is_os_threads != 0);
215void ThreadSimpleImpl::
216sleep_this(
double seconds) {
217 _manager->enqueue_sleep(
this, seconds);
218 _manager->next_context();
224void ThreadSimpleImpl::
225yield_this(
bool volunteer) {
226 if (thread_cat->is_debug() && volunteer) {
228 <<
"Force-yielding " << _parent_obj->get_name() <<
"\n";
230 _manager->enqueue_ready(
this,
true);
231 _manager->next_context();
237void ThreadSimpleImpl::
238st_begin_thread(
void *data) {
239 ThreadSimpleImpl *self = (ThreadSimpleImpl *)data;
240 self->begin_thread();
246void ThreadSimpleImpl::
249 thread_state_swap(_python_state);
252#ifdef HAVE_POSIX_THREADS
253 _posix_system_thread_id = pthread_self();
256 _win32_system_thread_id = GetCurrentThreadId();
261 _parent_obj->thread_main();
264 _status = TS_finished;
267 JoiningThreads::iterator jti;
268 for (jti = _joining_threads.begin(); jti != _joining_threads.end(); ++jti) {
269 _manager->enqueue_ready(*jti,
false);
271 _joining_threads.clear();
273 _manager->enqueue_finished(
this);
274 _manager->next_context();
virtual void * mmap_alloc(size_t size, bool allow_exec)
Allocates a raw page or pages of memory directly from the OS.
virtual void mmap_free(void *ptr, size_t size)
Frees a block of memory previously allocated via mmap_alloc().
size_t round_up_to_page_size(size_t size) const
Rounds the indicated size request up to the next larger multiple of page_size, to qualify it for a ca...
A thread; that is, a lightweight process.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.