Marc Lehmann wrote:
On Wed, Apr 09, 2008 at 10:49:51AM -0500, Brandon Black <[EMAIL PROTECTED]> 
wrote:
meaningful runtime leakage in practice). The first is that the signals array isn't ever deallocated. This fixed it for me locally:

thats not a problem, it does not leak (the signals array cannot be
deallocated for various reasons, but its not per-loop, so no leak).


It doesn't leak in the long term, because it's a one shot thing, but it is an annoyance when you're trying to get clean valgrind output. I'll add an exception for it I guess.

Also, the default ev_realloc() does a realloc to zero for allocs of size zero, instead of an actual free(), which results in valgrind reporting a bunch of leaks of size zero at exit. Glibc's docs say realloc() to zero

actually, realloc is defined to be free in that case in the C programming
language. this is a known bug in valgrind. you might want to look if somebody
has reported it yet and if not, do so.


Fair enough.

It happens just once, when I start up my default loop. Usually this indicates a real code bug that should be fixed, although given the deep magic of libev, it wouldn't surprise me terribly if the code was ok and valgrind just can't understand what's going on :)

Hmm, realloc (*, 0) to free memory is usually a code bug? That would
be surprising, realloc was designed to be a full-blwon memory manager
function, and lots of programs use it. If memory is resized and later the
pointer is accessed beyond the reallocated size, that would be a bug, of
course, but that is a bug regardless of how large the size parameter was.

realloc (*, 0) is a bug in the same cases where free(x) would be a bug, and
free does not usually indicate a real code bug.

I haven't further tracked this down yet, but I will get around to it, just a heads up in case something obvious occurs to someone else.

It is never wrong to report what you see (well, if the reports have a
certain minimum quality, like yours :), even if its not a real issue,
sometimes it should be documented to spare people some work.


Sorry maybe I wasn't clear. Those error messages I pasted are a completely separate issue from the realloc thing. I tracked it down now to the point that I can interpret the messages (and exactly when they occur) as meaning: when poll_poll() is called, the 0th member of the poll set, which is the read side of the pipe that's set up for signals and such, has an "revents" member which is uninitialized memory, and poll_poll() is making decisions based on reading that ununitialized memory. The reason I don't see any worse behavior is that even though it's "uninitialized", being an early allocation it tends to be zero'd out anyways by chance.

-- Brandon

_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to