ev_loop_destroy memory leak

Juan Pablo L jpablolorenzetti at gmail.com
Tue Dec 28 16:01:28 CET 2010


thank you very much, i know 0 bytes lost is no byte lost but it just makes
me uncomfortable :) since i have never seen it i m not sure if it is safe to
ignore also the 9 errors reported because of it does not look nice to me...
regarding the question about the ev_unref i just got it from reading other
posts so please ignore that question, i tested and i do not get a
segmentation fault anymore.
i will try to check for a new valgrind version and test again.

On 28 December 2010 10:44, Brian Maher <brian at brimworks.com> wrote:

> I've seen "0 bytes lost in ..." messages when you use realloc() to
> free() memory (aka call it with the second argument being zero).  In
> my case, I solved the problem by writing a realloc() replacement that
> checks if the second argument is zero, and if so it calls free()...
> similarly if the first argument is NULL my realloc() replacement calls
> malloc()... but ultimately this is just a false alarm (perhaps it has
> been fixed in newer versions of valgrind?).
>
> Cheers,
> -Brian
>
> On Tue, Dec 28, 2010 at 6:35 AM, Juan Pablo L
> <jpablolorenzetti at gmail.com> wrote:
> > Hi, i m trying to build an application using libev for the first time,
> this
> > application was written with glib but i m trying to change it into libev,
> i
> > have 1 issue and 1 question: the following code gives memory leaks at
> > ev_loop_destroy according to valgrind:
> >
> > #include <unistd.h>
> > #include <stdio.h>
> > #include <time.h>
> > #include <string.h>
> > #include <sys/time.h>
> > #include <errno.h>
> > #include <pthread.h>
> > #include <glib.h>
> > #include "async_callback.h"
> > #include "log.h"
> >
> > #define EV_STANDALONE 1
> > #include <ev.c>
> >
> > //
> > // globals
> > //
> >
> > typedef struct _LogObject
> > {
> >     FILE *log_file;
> >     char *logpath;
> >     int logpath_len;
> >     int log_handler_id;
> >     struct ev_loop *main_loop;
> >     ev_async callback_source;
> >     //async_source as;
> >     GThread *log_thread;
> > }LogObject;
> >
> > typedef struct _LogData
> > {
> >     char *log_domain;
> >     GLogLevelFlags level;
> >     char *message;
> > }LogData;
> >
> > static LogObject g_log_object;
> >
> > // handler for all log messages
> > void gfep_log_handler(const char *p_log_domain,GLogLevelFlags
> p_level,char
> > *p_message,void *p_user_data);
> >
> > // entry thread function
> > void log_run(void *p_log_object);
> >
> > // switch the log file after 3600 segs
> > bool log_switch_file(LogObject *p_log_object);
> >
> > // write into the log file
> > bool log_write_file(struct ev_loop *main_loop,ev_async
> *callback_source,int
> > events);
> >
> > // delete a LogData object passed to the loop
> > void log_handler_free_log_data(LogData *p_log_data);
> >
> > bool init_logging(char *p_logpath)
> > {
> >     g_log_object.main_loop = ev_loop_new(EVFLAG_AUTO);
> >     ev_async_init(&g_log_object.callback_source,(void*)log_write_file);
> >     ev_async_start(g_log_object.main_loop,&g_log_object.callback_source);
> >     ev_unref(g_log_object.main_loop);
> >
> >     // create the thread
> >     g_log_object.log_thread =
> > g_thread_create((GThreadFunc)log_run,&g_log_object,TRUE,&error);
> >     if(g_log_object.log_thread == NULL)
> >     {
> >         printf("Could not start log thread: %s",error->message);
> >         g_error_free(error);
> >         return false;
> >     }
> >     g_thread_set_priority(g_log_object.log_thread,G_THREAD_PRIORITY_LOW);
> >
> >     // start logging
> >     g_message("Logging started");
> >
> >     return true;
> > }
> >
> > void stop_logging()
> > {
> >     g_message("Logging stopped");
> >
> >     ev_async_stop(g_log_object.main_loop,&g_log_object.callback_source);
> >     ev_break(g_log_object.main_loop,EVBREAK_ALL);
> >     ev_loop_destroy(g_log_object.main_loop);
> >
> >
> >     if(g_log_object.log_thread != NULL)
> >     {
> >         // join the thread
> >         g_thread_join(g_log_object.log_thread);
> >     }
> >
> >     // remove the handler
> >     g_log_remove_handler(NULL,g_log_object.log_handler_id);
> >
> >     // free allocated memory
> >     g_free(g_log_object.logpath);
> >
> >     // close the file
> >     if(g_log_object.log_file != NULL)
> >     {
> >         fclose(g_log_object.log_file);
> >     }
> > }
> >
> > void gfep_log_handler(const char *p_log_domain,GLogLevelFlags
> p_level,char
> > *p_message,void *p_user_data)
> > {
> >     log_data->message = strdup(p_message);
> >     // send it to the log thread
> >     g_log_object.callback_source.data = strdup(p_message);
> >     ev_async_send(g_log_object.main_loop,&g_log_object.callback_source);
> >
> > }
> >
> > void log_run(void *p_log_object)
> > {
> >     LogObject *log_object = (LogObject*)p_log_object;
> >
> >     ev_run(log_object->main_loop,0);
> >     g_thread_exit(NULL);
> > }
> >
> > bool log_write_file(struct ev_loop *main_loop,ev_async
> *callback_source,int
> > events)
> > {
> >     printf("%s\n",/*((LogData*)callback_source->data)->message*/"");
> >     return true;
> > }
> >
> > I omitted other things, as you can see the ev_run is running in a
> separate
> > thread, the functions init_logging and and stop_logging are called from
> the
> > main thread to start and stop logging, after this is executed valgrind
> > reports the following:
> >
> > ==13453== 0 bytes in 1 blocks are definitely lost in loss record 5 of 38
> > ==13453==    at 0x4005BDC: malloc (vg_replace_malloc.c:195)
> > ==13453==    by 0x4005C66: realloc (vg_replace_malloc.c:476)
> > ==13453==    by 0x804C0B4: ev_realloc_emul (ev.c:611)
> > ==13453==    by 0x804C0DE: ev_realloc (ev.c:637)
> > ==13453==    by 0x804ECF8: ev_loop_destroy (ev.c:1832)
> > ==13453==    by 0x80534B7: stop_logging (log.c:116)
> > ==13453==    by 0xAB9EFE: exit (in /lib/libc-2.12.90.so)
> > ==13453==    by 0xAA0E1D: (below main) (in /lib/libc-2.12.90.so)
> >
> > and also gives 9 errors (which are the 9 memory leaks) even thou it says
> 0
> > bytes was lost. so i have never seen this kind of reports before. Also, i
> > would like to know, why if i do not do an ev_unref after statrting the
> > watcher i get a segmentation fault when i stop the application ?
> thanks!!!!
> >
> > _______________________________________________
> > libev mailing list
> > libev at lists.schmorp.de
> > http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
> >
>
>
>
> --
> Brian Maher >> Glory to God <<
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.schmorp.de/pipermail/libev/attachments/20101228/7f26ce7a/attachment.html>


More information about the libev mailing list