[comp.windows.x] XSync

montnaro@spyder.crd.ge.com (Skip Montanaro) (08/27/90)

I'm trying to track down some memory leaks in a program of ours. As a first
check, in gdb I set breakpoints in malloc() and free(), with actions to
print a short backtrace and then continue. Not surprisingly, I count more
malloc()s than free()s. What is a bit surprising is the following two
backtraces that occur frequently:

    #0  0x274164 in malloc ()
    #1  0x25b938 in _XEnq ()
    #2  0x25b898 in _XReply ()
    #3  0x2594d0 in XSync ()
    (More stack frames follow...)

    #0  0x274164 in malloc ()
    #1  0x25b938 in _XEnq ()
    #2  0x24b1d4 in _XWaitForWritable ()
    #3  0x25aeb0 in _XFlush ()
    (More stack frames follow...)

As far as I can tell, there are no matching backtraces that call free(). In
fact, the only free() calls I saw connected with Xlib were during
XOpenDisplay() or XSetStandardProperties(), very early on during execution.
Those all appeared to match immediately preceeding malloc() or calloc()
calls.

I know absolutely nothing about Xlib internals. Is there some kind soul who
can explain where _XEnq()'s mallocated storage is freed, if at all?

Thx,

--
Skip (montanaro@crdgw1.ge.com)

rws@EXPO.LCS.MIT.EDU (Bob Scheifler) (08/27/90)

    Is there some kind soul who
    can explain where _XEnq()'s mallocated storage is freed, if at all?

Xlib maintains a global (not per display) free list of event queue elements.
They are never freed, not even at display close.  I guess the assumption is
that the free list would never get very large.  If you want to consider this
a bug, you are welcome to submit a bug report, but in that case please provide
a suggested effecient alternate implementation strategy, and explain why the
current implementation causes a real problem in your application.