Sfoglia il codice sorgente

upon_birth race condition issues

David Rose 17 anni fa
parent
commit
3bd5914b57

+ 2 - 2
panda/src/event/asyncTask.cxx

@@ -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);

+ 1 - 1
panda/src/event/asyncTask.h

@@ -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:

+ 7 - 2
panda/src/event/asyncTaskManager.cxx

@@ -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();
 }
 
 ////////////////////////////////////////////////////////////////////

+ 6 - 4
panda/src/event/asyncTaskSequence.cxx

@@ -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();
   }
 }

+ 1 - 1
panda/src/event/asyncTaskSequence.h

@@ -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:

+ 2 - 2
panda/src/event/genericAsyncTask.cxx

@@ -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);

+ 1 - 1
panda/src/event/genericAsyncTask.h

@@ -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:

+ 2 - 2
panda/src/event/pythonTask.cxx

@@ -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();
 }
 

+ 1 - 1
panda/src/event/pythonTask.h

@@ -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: