View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0012044VTK(No Category)public2011-04-04 14:152016-08-12 09:55
ReporterJulien Finet 
Assigned ToDave DeMarle 
PrioritynormalSeveritymajorReproducibilityalways
StatusclosedResolutionmoved 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0012044: Order of called observers
DescriptionNightly 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
 
Steps To Reproducevoid 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
Additional InformationCurrent 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;
}
TagsNo tags attached.
Project
Type
Attached Files

 Relationships

  Notes
(0031200)
Dave DeMarle (administrator)
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 (administrator)
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.

 Issue History
Date Modified Username Field Change
2011-04-04 14:15 Julien Finet New Issue
2013-07-22 18:38 Dave DeMarle Note Added: 0031200
2013-07-22 18:38 Dave DeMarle Status backlog => expired
2013-07-22 18:38 Dave DeMarle Assigned To => Dave DeMarle
2016-08-12 09:55 Kitware Robot Note Added: 0037228
2016-08-12 09:55 Kitware Robot Status expired => closed
2016-08-12 09:55 Kitware Robot Resolution open => moved


Copyright © 2000 - 2018 MantisBT Team