mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-17 20:23:47 -04:00
upon_birth race condition issues
This commit is contained in:
parent
22b4a9c3b8
commit
3bd5914b57
@ -472,9 +472,9 @@ do_task() {
|
||||
// This function is called with the lock *not* held.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void AsyncTask::
|
||||
upon_birth() {
|
||||
upon_birth(AsyncTaskManager *manager) {
|
||||
// Throw a generic add event for the manager.
|
||||
string add_name = _manager->get_name() + "-addTask";
|
||||
string add_name = manager->get_name() + "-addTask";
|
||||
PT_Event event = new Event(add_name);
|
||||
event->add_parameter(EventParameter(this));
|
||||
throw_event(event);
|
||||
|
@ -119,7 +119,7 @@ protected:
|
||||
|
||||
virtual bool is_runnable();
|
||||
virtual DoneStatus do_task();
|
||||
virtual void upon_birth();
|
||||
virtual void upon_birth(AsyncTaskManager *manager);
|
||||
virtual void upon_death(AsyncTaskManager *manager, bool clean_exit);
|
||||
|
||||
protected:
|
||||
|
@ -223,6 +223,13 @@ add(AsyncTask *task) {
|
||||
nassertv(task->_manager == NULL &&
|
||||
task->_state == AsyncTask::S_inactive);
|
||||
nassertv(!do_has_task(task));
|
||||
|
||||
_lock.release();
|
||||
task->upon_birth(this);
|
||||
_lock.lock();
|
||||
nassertv(task->_manager == NULL &&
|
||||
task->_state == AsyncTask::S_inactive);
|
||||
nassertv(!do_has_task(task));
|
||||
|
||||
AsyncTaskChain *chain = do_find_task_chain(task->_chain_name);
|
||||
if (chain == (AsyncTaskChain *)NULL) {
|
||||
@ -233,8 +240,6 @@ add(AsyncTask *task) {
|
||||
}
|
||||
chain->do_add(task);
|
||||
}
|
||||
|
||||
task->upon_birth();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -132,8 +132,8 @@ do_task() {
|
||||
// return with it held.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void AsyncTaskSequence::
|
||||
upon_birth() {
|
||||
AsyncTask::upon_birth();
|
||||
upon_birth(AsyncTaskManager *manager) {
|
||||
AsyncTask::upon_birth(manager);
|
||||
_task_index = 0;
|
||||
set_current_task(NULL, true);
|
||||
}
|
||||
@ -180,17 +180,19 @@ set_current_task(AsyncTask *task, bool clean_exit) {
|
||||
nassertv(_current_task->_state == S_active_nested);
|
||||
nassertv(_current_task->_manager == _manager || _manager == NULL);
|
||||
_current_task->_state = S_inactive;
|
||||
_current_task->upon_death(_manager, clean_exit);
|
||||
_current_task->_manager = NULL;
|
||||
_current_task->upon_death(_manager, clean_exit);
|
||||
}
|
||||
|
||||
_current_task = task;
|
||||
|
||||
if (_current_task != (AsyncTask *)NULL) {
|
||||
nassertv(_current_task->_state == S_inactive);
|
||||
nassertv(_current_task->_manager == NULL);
|
||||
_current_task->upon_birth(_manager);
|
||||
nassertv(_current_task->_state == S_inactive);
|
||||
nassertv(_current_task->_manager == NULL);
|
||||
_current_task->_manager = _manager;
|
||||
_current_task->_state = S_active_nested;
|
||||
_current_task->upon_birth();
|
||||
}
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ PUBLISHED:
|
||||
protected:
|
||||
virtual bool is_runnable();
|
||||
virtual DoneStatus do_task();
|
||||
virtual void upon_birth();
|
||||
virtual void upon_birth(AsyncTaskManager *manager);
|
||||
virtual void upon_death(AsyncTaskManager *manager, bool clean_exit);
|
||||
|
||||
private:
|
||||
|
@ -85,8 +85,8 @@ do_task() {
|
||||
// This function is called with the lock *not* held.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void GenericAsyncTask::
|
||||
upon_birth() {
|
||||
AsyncTask::upon_birth();
|
||||
upon_birth(AsyncTaskManager *manager) {
|
||||
AsyncTask::upon_birth(manager);
|
||||
|
||||
if (_upon_birth != NULL) {
|
||||
(*_upon_birth)(this, _user_data);
|
||||
|
@ -50,7 +50,7 @@ public:
|
||||
protected:
|
||||
virtual bool is_runnable();
|
||||
virtual DoneStatus do_task();
|
||||
virtual void upon_birth();
|
||||
virtual void upon_birth(AsyncTaskManager *manager);
|
||||
virtual void upon_death(AsyncTaskManager *manager, bool clean_exit);
|
||||
|
||||
private:
|
||||
|
@ -475,8 +475,8 @@ do_python_task() {
|
||||
// This function is called with the lock *not* held.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void PythonTask::
|
||||
upon_birth() {
|
||||
AsyncTask::upon_birth();
|
||||
upon_birth(AsyncTaskManager *manager) {
|
||||
AsyncTask::upon_birth(manager);
|
||||
register_to_owner();
|
||||
}
|
||||
|
||||
|
@ -51,7 +51,7 @@ protected:
|
||||
virtual bool is_runnable();
|
||||
virtual DoneStatus do_task();
|
||||
DoneStatus do_python_task();
|
||||
virtual void upon_birth();
|
||||
virtual void upon_birth(AsyncTaskManager *manager);
|
||||
virtual void upon_death(AsyncTaskManager *manager, bool clean_exit);
|
||||
|
||||
private:
|
||||
|
Loading…
x
Reference in New Issue
Block a user