Hi, >From reading the code, I assume that the `pattern_db_new()` does some sort of allocation of a new pattern DB. I don't see any code releasing the pattern DB. Is that just missing from your post or something that some automatic mechanism does?
>>Apologies, that part got missed in the code snippet. I am making the free call in the C code. node.c --------- int load_pattern_db(const gchar* file, key_value_cb cb) { if(patterndb != NULL){ pattern_db_free(patterndb); } patterndb = pattern_db_new(); pattern_db_reload_ruleset(patterndb, configuration, file); pattern_db_set_emit_func(patterndb, pdbtool_pdb_emit_accumulate, cb); return 0; } You can try a similar C program that instantiates and frees the structure to check for similar behavior. >> To verify if the C code had some issue, I called the C wrapper code method '*load_pattern_db*' from my main.c to completely eliminate Go code here. What I found is there is no increase in memory consumption after every call ('load_pattern_db' was called 5 times). Hence there is no issue from C code. Thanks, Nitish On Mon, Mar 16, 2020 at 7:04 PM Gregor Best <b...@pferdewetten.de> wrote: > This might be a dumb question but... > > From reading the code, I assume that the `pattern_db_new()` does some sort > of allocation of a new pattern DB. I don't see any code releasing the > pattern DB. Is that just missing from your post or something that some > automatic mechanism does? > > If not, that might be your leak. > On 09.03.20 12:33, Nitish Saboo wrote: > > Hi > > Following are my Go code and C header file and C wrapper code > > parser.go > ========== > var f *os.File > > func LoadPatternDB(patterndb string) { > path := C.CString(patterndb) > defer C.free(unsafe.Pointer(path)) > C.load_pattern_db(path, (C.key_value_cb)(unsafe.Pointer(C.callOnMeGo_cgo))) > } > > //export ParsedData > func ParsedData(k *C.char, val *C.char, val_len C.size_t) { > f.WriteString(C.GoString(k)) > f.WriteString("\n") > } > > cfunc.go > ======== > /* > #include <stdio.h> > // The gateway function > void callOnMeGo_cgo(char *k, char *val, size_t val_len) > { > void ParsedData(const char *k, const char *val, size_t val_len); > ParsedData(k, val, val_len); > } > */ > import "C" > > node.h > ======= > > #ifndef TEST_H_INCLUDED > #define TEST_H_INCLUDED > > #include <stdlib.h> > > typedef void (*key_value_cb)(const char* k, const char* val, size_t > val_len); > int load_pattern_db(const char* file, key_value_cb cb); > > #endif > > node.c > --------- > int load_pattern_db(const gchar* file, key_value_cb cb) > { > patterndb = pattern_db_new(); > pattern_db_reload_ruleset(patterndb, configuration, file); > pattern_db_set_emit_func(patterndb, pdbtool_pdb_emit_accumulate, cb); > return 0; > } > > > I am calling '*LoadPatternDB*' method in my parser.go file that makes a > cgo call '*C.load_pattern_db'* where I am passing a callback function to > the C code. > The C code is a wrapper code that internally calls some syslog-ng library > apis' > > What I observed is: > > 1)As soon as I call LoadPatternDB() method in parser.go there is some > increase in memory consumption(some memory leak).Ideally that should not > have happened. > > 2)To verify if the C code had some issue, I called the C wrapper code > method '*load_pattern_db*' from my main.c in the following manner to > completely eliminate Go code here.What I found is there is no increase in > memory consumption after every call ('load_pattern_db' was called 5 > times).Hence there is no memory leak from C code.So the issue lies in the > Go code in '*LoadPatternDB*' method in parser.go > > main.c > ======= > > void check(char *key, char *value, size_t value_len) > { > printf("I am in function check\n"); > } > > int main(void){ > char* filename = "/home/nitish/default.xml"; > key_value_cb s = check; > int i; > for (i=1; i<=5; i++) > { > load_pattern_db(filename, s); > printf("Sleeping for 5 second.\n"); > sleep(5); > } > printf("Loading done 5 times.\n"); > return 0; > } > > 3)Can someone please guide me and help me figure out the mem-leak in > 'LoadPatternDB' method in parser.go at very first glance? Is the callback > function pointer an issue here ? > > 4)What tool can I use to check this mem-leak ? > > Thanks, > Nitish > -- > 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/CALjMrq5cAJ19CQ8OmMPSJmVB1P3t4hE0CKZ4HsEsH-mp6zm3Ng%40mail.gmail.com > <https://groups.google.com/d/msgid/golang-nuts/CALjMrq5cAJ19CQ8OmMPSJmVB1P3t4hE0CKZ4HsEsH-mp6zm3Ng%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > -- > -- > Gregor Best > b...@pferdewetten.de > > -- > 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/fee07a13-e3d7-4a2e-6a6c-fdb11140ce21%40pferdewetten.de > <https://groups.google.com/d/msgid/golang-nuts/fee07a13-e3d7-4a2e-6a6c-fdb11140ce21%40pferdewetten.de?utm_medium=email&utm_source=footer> > . > -- 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/CALjMrq4-%3DcsuKRP4Xa-MVgrm5MJdWLNVe0v5_i3jswjesHQTqA%40mail.gmail.com.