23 AtomicAdjust::Integer AsyncTask::_next_task_id;
31 AsyncTask(
const string &name) :
32 _chain_name(
"default"),
39 _servicing_thread(nullptr),
51 AtomicAdjust::Integer current_id = _next_task_id;
53 current_id = _next_task_id;
56 _task_id = current_id;
64 nassertv(_state == S_inactive && _manager ==
nullptr && _chain ==
nullptr);
75 if (manager !=
nullptr) {
76 nassertr(_chain->_manager == manager,
false);
77 if (task_cat.is_debug()) {
79 <<
"Removing " << *
this <<
"\n";
82 if (_chain->do_remove(
this,
true)) {
85 if (task_cat.is_debug()) {
87 <<
" (unable to remove " << *
this <<
")\n";
105 if (_manager !=
nullptr) {
107 if (_state == S_sleeping) {
127 if (_manager !=
nullptr) {
129 if (_state == S_sleeping) {
130 double now = _manager->_clock->get_frame_time();
131 _wake_time = now + _delay;
132 _start_time = _wake_time;
134 make_heap(_chain->_sleeping.begin(), _chain->_sleeping.end(),
135 AsyncTaskChain::AsyncTaskSortWakeTime());
148 nassertr(_state != S_inactive, 0.0);
149 nassertr(_manager !=
nullptr, 0.0);
150 return _manager->_clock->get_frame_time() - _start_time;
161 nassertr(_state != S_inactive, 0);
162 nassertr(_manager !=
nullptr, 0);
163 return _manager->_clock->get_frame_count() - _start_frame;
170 set_name(
const string &name) {
171 if (_manager !=
nullptr) {
173 if (Namable::get_name() != name) {
177 _manager->remove_task_by_name(
this);
178 Namable::set_name(name);
179 _manager->add_task_by_name(
this);
183 Namable::set_name(name);
189 size_t end = name.size();
190 size_t colon = name.find(
':');
191 if (colon != string::npos) {
192 end = std::min(end, colon);
199 size_t trimmed = end;
202 while (p > 0 && isdigit(name[p - 1])) {
205 if (p > 0 && (name[p - 1] ==
'-' || name[p - 1] ==
'_')) {
213 PStatCollector parent(_show_code_pcollector, name.substr(0, trimmed));
216 _task_pcollector = parent;
226 string name = get_name();
227 size_t trimmed = name.size();
230 while (p > 0 && isdigit(name[p - 1])) {
233 if (p > 0 && (name[p - 1] ==
'-' || name[p - 1] ==
'_')) {
242 return name.substr(0, trimmed);
251 if (chain_name != _chain_name) {
252 if (_manager !=
nullptr) {
254 if (_state == S_active) {
260 AsyncTaskChain *chain_a = manager->do_find_task_chain(_chain_name);
261 nassertv(chain_a !=
nullptr);
262 chain_a->do_remove(
this);
263 _chain_name = chain_name;
265 jump_to_task_chain(manager);
270 _chain_name = chain_name;
275 _chain_name = chain_name;
295 if (_manager !=
nullptr) {
297 if (_state == S_active && _sort >= _chain->_current_sort) {
301 AsyncTaskChain *chain = _manager->do_find_task_chain(_chain_name);
302 nassertv(chain !=
nullptr);
303 chain->do_remove(
this);
339 if (priority != _priority) {
340 if (_manager !=
nullptr) {
342 if (_state == S_active && _sort >= _chain->_current_sort) {
346 AsyncTaskChain *chain = _manager->do_find_task_chain(_chain_name);
347 nassertv(chain !=
nullptr);
348 chain->do_remove(
this);
349 _priority = priority;
355 _priority = priority;
360 _priority = priority;
369 output(std::ostream &out)
const {
372 out <<
" " << get_name();
382 AsyncTaskChain *chain_b = manager->do_find_task_chain(_chain_name);
383 if (chain_b ==
nullptr) {
385 <<
"Creating implicit AsyncTaskChain " << _chain_name
386 <<
" for " << manager->get_type() <<
" "
387 << manager->get_name() <<
"\n";
388 chain_b = manager->do_make_task_chain(_chain_name);
390 chain_b->do_add(
this);
397 AsyncTask::DoneStatus AsyncTask::
398 unlock_and_do_task() {
399 nassertr(_manager !=
nullptr, DS_done);
404 nassertr(current_thread->_current_task ==
nullptr, DS_interrupt);
407 __attribute__((unused))
418 nassertr(ptr ==
nullptr, DS_interrupt);
419 nassertr(current_thread->_current_task ==
this, DS_interrupt);
423 _manager->_lock.unlock();
425 double start = clock->get_real_time();
426 _task_pcollector.start();
427 DoneStatus status = do_task();
428 _task_pcollector.stop();
429 double end = clock->get_real_time();
432 _manager->_lock.lock();
435 _max_dt = std::max(_dt, _max_dt);
438 _chain->_time_in_frame += _dt;
441 nassertr(current_thread->_current_task ==
this, status);
452 nassertr(ptr ==
this, DS_interrupt);
453 nassertr(current_thread->_current_task ==
nullptr, DS_interrupt);
465 nassertr(
done(),
false);
512 AsyncTask::DoneStatus AsyncTask::
526 string add_name = manager->get_name() +
"-addTask";
527 PT_Event
event =
new Event(add_name);
548 if (manager !=
nullptr) {
549 string remove_name = manager->get_name() +
"-removeTask";
550 PT_Event
event =
new Event(remove_name);