[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