Unfortunately it does not give any info. :(

Thanks,
Chun

On Saturday, June 3, 2017 at 1:16:18 PM UTC-4, Egon wrote:
>
> Does race detector say something useful?
>
> On Friday, 2 June 2017 21:18:31 UTC+3, Chun Zhang wrote:
>>
>> I am trying to store some complicated data structure with a map, and 
>> eventually search and use it. 
>> Since the structure can change with different applications, and it has to 
>> work with multiple thread, I defined a generic map like follows
>>
>> type IndexedMap struct {
>>         sync.RWMutex
>>         DataNode  map[interface{}]interface{}
>> }
>>
>> Insert is defined as 
>>
>> func (m *IndexedMap) Insert(dataIndex interface{}, data interface{}) error {
>>
>>        var err error
>>
>>        m.Lock()
>>
>>        //if the node exist
>>        if _, ok := m.DataNode[dataIndex]; ok {
>>               m.Unlock()
>>               return m.Update(dataIndex, data)
>>        } else {
>>               //insert new node
>>               m.DataNode[dataIndex] = data
>>        }
>>
>>        m.Unlock()
>>
>>        return err
>> }
>>
>>
>> ** For now, the data being inserted is a structure, not the pointer to 
>> the structure and the key/index is a string.**
>>
>>
>> Then when I need to find a piece of data, I tried to get a snapshot of 
>> the database first and then look for it
>>
>> v, ok : = m.SnapShotData()[key] where
>>
>> func (m *IndexedMap) SnapShotData() map[interface{}]interface{} {
>>
>>        ret := make(map[interface{}]interface{})
>>
>>        m.Lock()
>>        for k, v := range m.DataNode {
>>               ret[k] = v
>>        }
>>        m.Unlock()
>>
>>        return ret
>> }
>>
>>
>> Then the data v is used to do other things, never modified though. 
>>
>> This works but the performance is abysmal when the database getting 
>> large. So, I tried to search without copying 
>>
>> v, ok := m.DataSearch(key)
>>
>> func (m *IndexedMap) DataSearch(dataIndex interface{}) (interface{}, bool) {
>>
>>        var data interface{}
>>        var ok bool
>>
>>        m.Lock()
>>
>>        data, ok = m.DataNode[dataIndex]
>>
>>        m.Unlock()
>>
>>        return data, ok
>> }
>>
>>
>>
>> However, with this implementation, I always get crash after running the 
>> program just a little bit with the following error
>>
>> *** Error in `./colordecoder': double free or corruption (fasttop): 
>> 0x00007f943c26f590 ***
>> SIGABRT: abort
>> PC=0x7f946c2eac37 m=4
>> signal arrived during cgo execution
>>
>> I guess somewhere along the line the copy is a not a hard copy but just a 
>> reference copy. However, I couldn't understand the difference between above 
>> two approaches, seems that in SnapShotData I did exactly the same thing, 
>> but no crash ever. 
>>
>> Can somebody tell me where I did wrong? Thanks!!
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to