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.