| View Issue Details [ Jump to Notes ] | [ Print ] | ||||||||
| ID | Project | Category | View Status | Date Submitted | Last Update | ||||
| 0012044 | VTK | (No Category) | public | 2011-04-04 14:15 | 2016-08-12 09:55 | ||||
| Reporter | Julien Finet | ||||||||
| Assigned To | Dave DeMarle | ||||||||
| Priority | normal | Severity | major | Reproducibility | always | ||||
| Status | closed | Resolution | moved | ||||||
| Platform | OS | OS Version | |||||||
| Product Version | |||||||||
| Target Version | Fixed in Version | ||||||||
| Summary | 0012044: 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; } | ||||||||
| Tags | No tags attached. | ||||||||
| Project | |||||||||
| Type | |||||||||
| Attached Files | |||||||||
| Relationships | |
| 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. |
| Notes |
| 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 |
| Issue History |
| Copyright © 2000 - 2018 MantisBT Team |