I would also use pprof and ensure your Go code is not leaking memory. There are 
multiple tutorials on using memory profilers to detect memory leaks. 

> On Mar 16, 2020, at 9:12 AM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> 
> Looks like pattern_db is a global. Are you sure you don’t have multiple Go 
> routines calling the load? The global changes may not be visible- so the free 
> is doing nothing. 
> 
> You probably need synchronization or pinning the access routine to a thread. 
> 
>>> On Mar 16, 2020, at 9:03 AM, Nitish Saboo <nitish.sabo...@gmail.com> wrote:
>>> 
>> 
>> 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.
>>> -- 
>>> --
>>>   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.
>> 
>> -- 
>> 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.
> -- 
> 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/4A1AFEDD-2D70-4B33-A183-83887A79A9A0%40ix.netcom.com.

-- 
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/B4B6F587-D1DB-401C-8840-A12C77D52857%40ix.netcom.com.

Reply via email to