Hi,
I see. Seems like the reason why my code works is that I actually
support undo/redo for node deletion (for some data types) and therefore
the nodes are still alive while the deletion process is working and node
guard doesn't crash. I think that the idea is the same though - creating
a smart pointer from a raw pointer to a dead object leads to crash.
The simple solution is actually changing Remove method to start like:
void mitk::StandaloneDataStorage::Remove(const mitk::DataNode* node)
{
if (!IsInitialized())
throw std::logic_error("DataStorage not initialized");
if (node == NULL || !Exists(node))
return;
...
Something tells me that the without the fix I mentioned before it would
crash in Exists() call, but with it everything seems to work fine.
Rostislav.
On 12/01/2015 20:40, Nil Goyette wrote:
Hi all, ,
Pierre-Yves Menguy
I have the exact same problem using GetDataManagerSelection(). I tried
cout << selection.size(); many times (always selecting 2 nodes) and
the answer changes often :) The program crashes when it's 0 and it
"works" when it's 1. I never saw 2, strangely. I'm pretty sure it's a
race between two or more threads. The first thread is deleting the
user selection and the other thread(s) are reading
GetDataManagerSelection() and trying to delete more nodes.
Rostislav Khlebnikov
It doesn't change anything. I forgot to say that the program crashes
on line 116
mitk::DataNode::ConstPointer nodeGuard(node);
in void mitk::StandaloneDataStorage::Remove(const mitk::DataNode*
node) I thnk Exists() is never called.
Le 2015-01-12 14:27, Pierre-Yves Menguy a écrit :
Hello,
I can't test anything at the moment, but when the event is thrown,
can you request for "this->GetDataManagerSelection();" ?
It is available in the main plugin class, inheriting QmitkAbstractView.
Doing so, you'll be able to check if children nodes are also selected.
Best regards,
Pierre-Yves Menguy.
Le 2015-01-12 14:30, Rostislav Khlebnikov a écrit :
Hi Nil,
I have the following changes to mitkStandaloneDataStorage.cpp (from
line 128):
bool mitk::StandaloneDataStorage::Exists(const mitk::DataNode* node)
const
{
itk::MutexLockHolder<itk::SimpleFastMutexLock> locked(m_Mutex);
// Avoid creating smart pointer which would lead to crash
// return (m_SourceNodes.find(node) != m_SourceNodes.end());
for (AdjacencyList::const_iterator iter = m_SourceNodes.begin();
iter != m_SourceNodes.end(); ++iter) {
if (iter->first.GetPointer() == node) {
return true;
}
}
return false;
}
Likely this is the crash you experience - and this was the way I
fixed it in my fork of MITK (at least I think so as the commit was
done quite some time ago - in May - and the commit message is: "Avoid
creating smart pointer when the node might have been deleted." :)).
Rostislav.
On 12 January 2015 at 20:18, Nil Goyette <[email protected]
<mailto:[email protected]>> wrote:
Hi all,
I have at least two nodes (I have drawn more, but I can reproduce
the bug with 2 nodes)
- Node1
--- Node2 (child of Node1)
--- Node3
----- Node4
----- Node5
- Some other nodes
When the user deletes Node1, I want to delete all children nodes
(2, 3, 4, 5).
To do so, I use NodeDeleted(), I ask the DataStorage for all
derivative nodes of the deleted node and delete them all.
A problem arises when the user highlights all nodes and delete
them. Some nodes are deleted more then one time. Of course, there
are conditions in mitk and in my own code that check if the node
is null, but it still fails about half of the time. Since the
NodeRemoved() event is thrown *before* the actual deletion, the
null/exists checks are useless.
I'm probably not the first that want to delete all the children
of a node. I feel that this should be simple. Is there a feature
to do it that I'm not aware of?
--
Logo Imeka <http://imeka.ca/> Nil Goyette, M.Sc.
www.imeka.ca <http://imeka.ca/>
------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in
Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely
compliant.
www.gigenet.com <http://www.gigenet.com>
_______________________________________________
mitk-users mailing list
[email protected]
<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/mitk-users
--
Logo Imeka <http://imeka.ca/> Nil Goyette, M.Sc.
www.imeka.ca <http://imeka.ca/>
------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
www.gigenet.com
_______________________________________________
mitk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users
------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
www.gigenet.com
_______________________________________________
mitk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users