[vtk-developers] [VTK 0012044]: Order of called observers

Julien Finet julien.finet at kitware.com
Mon Apr 30 09:03:23 EDT 2012


Hi,

I would like to resubmit the idea to fix that issue now that VTK is in
breaking-backward-compatibility mode :-)
     http://review.source.kitware.com/5414

The main concern last year was the risk of breaking existing code. I hope
this fear has blew up with VTK 6.0 :-P

Thanks,
Julien.

On Mon, Apr 4, 2011 at 2:15 PM, Mantis Bug Tracker <
mantis at public.kitware.com> wrote:

>
> The following issue has been SUBMITTED.
> ======================================================================
> http://public.kitware.com/Bug/view.php?id=12044
> ======================================================================
> Reported By:                Julien Finet
> Assigned To:
> ======================================================================
> Project:                    VTK
> Issue ID:                   12044
> Category:                   (No Category)
> Reproducibility:            always
> Severity:                   major
> Priority:                   normal
> Status:                     new
> ======================================================================
> Date Submitted:             2011-04-04 14:15 EDT
> Last Modified:              2011-04-04 14:15 EDT
> ======================================================================
> Summary:                    Order of called observers
> Description:
> 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
>
>
> Steps to Reproduce:
> 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
>
>
> Additional Information:
> 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;
> }
> ======================================================================
>
> Issue History
> Date Modified    Username       Field                    Change
> ======================================================================
> 2011-04-04 14:15 Julien Finet   New Issue
> ======================================================================
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtk-developers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20120430/ae14476d/attachment.html>


More information about the vtk-developers mailing list