Hi,
did this Problem also exist in earlier releases, so before 2014.10.0 or
is it related to the "thread-safety refactoring" of the DataStore, that
I red lately in this list?
Best,
Ingmar
Am 12.01.2015 22:23, schrieb Rostislav Khlebnikov:
> 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
>
------------------------------------------------------------------------------
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.
http://p.sf.net/sfu/gigenet
_______________________________________________
mitk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users