On Wed, Mar 4, 2020 at 3:57 AM Nitish Saboo <nitish.sabo...@gmail.com> wrote:
>
> I have CGO project.
>
> Following is my C header file and Go code
>
> syslog-node.h
> ===============
>
> #ifndef _TEST_H_
> #define _TEST_H_
>
> #include <stdlib.h>
>
> typedef void (*key_value_cb)(const char* key, const char* value, size_t 
> value_len, int work);
> typedef struct Foo{
>     key_value_cb cb;
>     int data;
> }Foo;
> int initialize_engine(const char* filename, const char* module_path, Foo *cb);
> int reload_pattern_db(const char* filename, Foo *cb);
>
>
> cfunc.go
> ========
> /*
>
> #include <stdio.h>
>
> // The gateway function
> void callOnMeGo_cgo(char *key, char *value, size_t value_len, int work)
> {
> void ParsedData(const char *key, const char *value, size_t value_len, int 
> work);
> ParsedData(key, value, value_len, work);
> }
> */
> import "C"
>
> main.go
> ========
>
> var InitStruct *C.struct_Foo;
>
> func InitializeEngine(pattern string, path string) {
> pattern_db := C.CString(pattern)
> module_path := C.CString(path)
> if InitStruct != nil{
> C.free(unsafe.Pointer(InitStruct))
> }
> InitStruct := (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo))
> InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo)
> InitStruct.data = C.int(0)
> fmt.Println(InitStruct)  <<<<<<<<<<<<<<<<<<<<<<<<<<<'&{0x4b79d0 0 [0 0 0 0]}' 
> got printed
> C.initialize_engine(pattern_db, module_path, InitStruct)
>
> }
>
> func ReloadPatternDB(patterndb string) {
>
> path := C.CString(patterndb)
> InitStruct = (*C.Foo)(C.calloc(1, C.sizeof_struct_Foo))   <<<<<<<Allocating a 
> new memory
> InitStruct.cb = (C.key_value_cb)(C.callOnMeGo_cgo)
> InitStruct.data = C.int(0)
> fmt.Println(InitStruct)    <<<<<<<<<<<<<<<<<<<<<<<<<<< '&{0x4b79d0 0 [0 0 0 
> 0]}' got printed
> C.reload_pattern_db(path, InitStruct)
>
> }
>
>
> I have a Go code where I have to call C functions 'initialize_engine' and 
> 'reload_pattern_db' respectively(one after the other ) and pass the C struct 
> from Go code.
>
>
> The issue is after allocating memory to 'InitStruct' using calloc in 
> 'InitializeEngine' method, the same memory location is getting printed in 
> ReloadPatternDB method even though I am allocating a new memory to 
> 'InitStruct' using calloc in 'ReloadPatternDB' method.
>
> 1) Is this the correct way to pass a C struct from a Go code to C code.
> 2) Is this a correct way to free the struct memory assigned to InitStruct 
> using calloc on Go side ?

You haven't showed us where the same memory location is getting
printed.  Note that fmt.Println is not printing the address of
InitStruct; it is printing the values of the fields.  If you want to
print the address, use fmt.Printf("%p\n", InitStruct).

Also note that InitStruct is a global variable.

Ian

-- 
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/CAOyqgcWgu6_MzroQhRifMBoq6r8br%2B031_t7GOdDDdnbg_2Liw%40mail.gmail.com.

Reply via email to