Hi,

I have the following function 'LoadPatternDB' where I am allocating memory 
for a C struct.My C struct contains the callback function.

1)I cannot deference the struct in the same func 'LoadPatternDB' because I 
get the following error when my callback function is called from C code:

*signal SIGSEGV: segmentation violation code=0x1 addr=0x7f1e00415341 
pc=0x7f1e00415341]*

2)The same code is running in multiple go routines.And because of that if I 
don't deallocate the memory I get the following error:

**** Error in `fatal error: bin/main': double free or corruption 
(fasttop)unexpected signal during runtime execution: 0x00007fd2b8588060 ****

My question is:

How can I store the address of the C struct (when memory is allocated using 
calloc) on Go side in an array so that I can deallocate the memory using 
'defer C.free(unsafe.Pointer(InitStruct))' when the callback is done.


'InitStruct := (*C.Accumulatedparams)(C.calloc(1, 
C.sizeof_struct_Accumulatedparams))'  >*>>> I want to store this address on 
Go side.*


Can some please guide me here ?


syslogparser.go
=============

func (obj SyslogParser) LoadPatternDB(opts Syslog, workerId int) {
patterndbpath := C.CString(opts.Patterndb)
defer C.free(unsafe.Pointer(patterndbpath))
InitStruct := (*C.Accumulatedparams)(C.calloc(1, 
C.sizeof_struct_Accumulatedparams))
/*/defer C.free(unsafe.Pointer(InitStruct)) . <<<<<<<<<<<<<<<<<<<<<<I 
cannot do this here*
InitStruct.callback = (C.key_value_cb)(C.callback)
InitStruct.data = C.int(workerId)
C.load_pattern_db(patterndbpath, 
(*C.Accumulatedparams)(unsafe.Pointer(InitStruct)), C.int(workerId))
}


//export Result
func Result(key *C.char, value *C.char, value_len C.size_t, mapid C.int) {
fmt.Println("Map Id: " + strconv.Itoa(int(mapid)))
value_field := C.GoStringN(value, C.int(value_len))
key_field := C.GoString(key)
remap, ok := constants.FIELD_MAPPINGS[key_field]
if ok {
Check.result[int(mapid)][remap] = value_field
//check.result[remap] = value_field
} else {
//check.result[key_field] = value_field
Check.result[int(mapid)][key_field] = value_field
}
}


cfuncs.go
-========
package lib

/*

#include <stdio.h>

// The gateway function
void callback(char *key, char *value, size_t value_len, int mapid)
{
//printf("C.callOnMeGo_cgo(): called");
void Result(const char *key, const char *value, size_t value_len, int 
mapid);
Result(key, value, value_len, mapid);
}
*/
import "C"

syslog-node.h
============

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED

#include <stdlib.h>

typedef void (*key_value_cb)(const char* key, const char* value, size_t 
value_len, int data);
typedef struct Accumulatedparams{
    key_value_cb callback;
    int data;
}Accumulatedparams;
int initialize_engine(const char* filename, const char* module_path);
int reload_pattern_db(const char* filename, Accumulatedparams *cb, int 
workerId);
int load_pattern_db(const char* filename, Accumulatedparams *cb, int 
workerId);

#endif

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/559ecb7d-f041-4381-884a-ecc49f204330%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to