MantisBT - VTK
View Issue Details
0012044VTK(No Category)public2011-04-04 14:152016-08-12 09:55
Julien Finet 
Dave DeMarle 
normalmajoralways
closedmoved 
 
 
0012044: Order of called observers
Nightly build documentation of vtkObject::AddObserver() says: "When events are invoked, the observers are called in the order they were added."

However the first observer of any given priority (default 0. included) is always called last.
For observers added in the following order:
observer1
observer2
observer3
observer4

The actual calling order is:
observer2
observer3
observer4
observer1 <- notice how the first observer is called last
 
void objectModified1(vtkObject *caller,unsigned long eid, void *clientData, void *callData) {
  std::cout << "modified1" << std::endl;
}

void objectModified2(vtkObject *caller,unsigned long eid, void *clientData, void *callData) {
  std::cout << "modified2" << std::endl;
}

void objectModified3(vtkObject *caller,unsigned long eid, void *clientData, void *callData) {
  std::cout << "modified3" << std::endl;
}

void objectModified4(vtkObject *caller,unsigned long eid, void *clientData, void *callData) {
  std::cout << "modified4" << std::endl;
}

int Test(int,char *[])
{
  vtkObject* obj = vtkObject::New();

  vtkCallbackCommand* callback1 = vtkCallbackCommand::New();
  callback1->SetCallback(objectModified1);
  obj->AddObserver(vtkCommand::ModifiedEvent, callback1);

  vtkCallbackCommand* callback2 = vtkCallbackCommand::New();
  callback2->SetCallback(objectModified2);
  obj->AddObserver(vtkCommand::ModifiedEvent, callback2);

  vtkCallbackCommand* callback3 = vtkCallbackCommand::New();
  callback3->SetCallback(objectModified3);
  obj->AddObserver(vtkCommand::ModifiedEvent, callback3);

  vtkCallbackCommand* callback4 = vtkCallbackCommand::New();
  callback4->SetCallback(objectModified4);
  obj->AddObserver(vtkCommand::ModifiedEvent, callback4);

  obj->Modified();

  callback4->Delete();
  callback3->Delete();
  callback2->Delete();
  callback1->Delete();

  obj->Delete();

  return 1;
}

Output:
modified2
modified3
modified4
modified1
Current code (and suggested fix):
//----------------------------------------------------------------------------
unsigned long vtkSubjectHelper::
AddObserver(unsigned long event, vtkCommand *cmd, float p)
{
  vtkObserver *elem;

  // initialize the new observer element
  elem = new vtkObserver;
  elem->Priority = p;
  elem->Next = NULL;
  elem->Event = event;
  elem->Command = cmd;
  cmd->Register(0);
  elem->Tag = this->Count;
  this->Count++;

  // now insert into the list
  // if no other elements in the list then this is Start
  if (!this->Start)
    {
    this->Start = elem;
    }
  else
    {
    // insert high priority first
    vtkObserver* prev = 0;
    vtkObserver* pos = this->Start;
    while(pos->Priority >= elem->Priority && pos->Next)
      {
      prev = pos;
      pos = pos->Next;
      }
    // pos is Start and elem should not be start
    if(pos->Priority > elem->Priority) ////////////////////////// HERE IT SHOULD BE: pos->Priority >= elem->Priority
      {
      pos->Next = elem;
      }
    else
      {
      if(prev)
        {
        prev->Next = elem;
        }
      elem->Next = pos;
      // check to see if the new element is the start
      if(pos == this->Start)
        {
        this->Start = elem;
        }
      }
    }
  return elem->Tag;
}
No tags attached.
Issue History
2011-04-04 14:15Julien FinetNew Issue
2013-07-22 18:38Dave DeMarleNote Added: 0031200
2013-07-22 18:38Dave DeMarleStatusbacklog => expired
2013-07-22 18:38Dave DeMarleAssigned To => Dave DeMarle
2016-08-12 09:55Kitware RobotNote Added: 0037228
2016-08-12 09:55Kitware RobotStatusexpired => closed
2016-08-12 09:55Kitware RobotResolutionopen => moved

Notes
(0031200)
Dave DeMarle   
2013-07-22 18:38   
Julien, if the bug is still present in 6.0.0, please reopen this report - and submit the patch and test via Gerrit.
(0037228)
Kitware Robot   
2016-08-12 09:55   
Resolving issue as `moved`.

This issue tracker is no longer used. Further discussion of this issue may take place in the current VTK Issues page linked in the banner at the top of this page.