[go-nuts] Copy map with empty interfaces

2017-06-03 Thread Tamás Gulácsi
How is cgo involved here? What kind of keys are you using?

-- 
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.


[go-nuts] Copy map with empty interfaces

2017-06-02 Thread Chun Zhang
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): 
0x7f943c26f590 ***
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.