Mail Archives: cygwin/2011/04/18/07:43:55
Hi!
Using the following STC, I'm seeing what appears to be a memory
leak in select(2).
----------------8<---(selectleak.c)---------
#include <sys/time.h>
#include <fcntl.h>
#include <stdlib.h>
int
main(void)
{
fd_set fdset;
struct timeval tv;
long flags = fcntl(0, F_GETFL);
fcntl(0, F_SETFL, flags | O_NONBLOCK);
for (;;) {
int res;
char buf[20];
FD_ZERO(&fdset);
FD_SET(0, &fdset);
tv.tv_sec = 1;
tv.tv_usec = 0;
res = select(1, &fdset, NULL, NULL, &tv);
if (res < 0)
exit(1);
if (!res)
continue;
res = read(0, buf, sizeof(buf));
if (res < 0)
exit(1);
}
return 0;
}
----------------8<--------------------------
$ gcc -o selectleak selectleak.c
$ cat /dev/zero | ./selectleak
Note that "./selectleak < /dev/zero" does not trigger the leak for me (I haven't
seen the memory usage go up, so at least not as reliably).
An "strace -m malloc,select" has this:
156 59281 [main] selectleak 8440 cygwin_select: 1, 0x23CCFC, 0x0, 0x0, 0x0
64 59345 [main] selectleak 8440 calloc: (1, 44) = 49AF58, called by 61002389
63 59408 [main] selectleak 8440 calloc: (1, 12) = 49B018, called by 61002389
111 59519 [main] selectleak 8440 cygwin_select: to NULL, ms FFFFFFFF
62 59581 [main] selectleak 8440 cygwin_select: sel.always_ready 0
138 59719 [select_pipe] selectleak 8440 peek_pipe: , ready for read: avail 130892
160 59879 [main] selectleak 8440 select_stuff::wait: woke up. wait_ret 1. verifying
57 59936 [main] selectleak 8440 set_bits: me 0x49AF58, testing fd 0 ()
62 59998 [main] selectleak 8440 set_bits: ready 1
62 60060 [main] selectleak 8440 select_stuff::wait: gotone 1
61 60121 [main] selectleak 8440 select_stuff::wait: returning 0
61 60182 [main] selectleak 8440 select_stuff::cleanup: calling cleanup routines
104 60286 [main] selectleak 8440 free: (0x49B018), called by 0x610BC1EA
65 60351 [main] selectleak 8440 peek_pipe: , already ready for read
62 60413 [main] selectleak 8440 set_bits: me 0x49AF58, testing fd 0 ()
62 60475 [main] selectleak 8440 set_bits: ready 1
74 60549 [main] selectleak 8440 select_stuff::poll: returning 1
61 60610 [main] selectleak 8440 select_stuff::cleanup: calling cleanup routines
65 60675 [main] selectleak 8440 select_stuff::~select_stuff: deleting select records
60 60735 [main] selectleak 8440 free: (0x49AF58), called by 0x610BC2A2
108 60843 [main] selectleak 8440 calloc: (1, 44) = 49AF58, called by 61002389
64 60907 [main] selectleak 8440 calloc: (1, 12) = 49B018, called by 61002389
126 61033 [main] selectleak 8440 peek_pipe: , ready for read: avail 130892
62 61095 [main] selectleak 8440 fhandler_base::ready_for_read: read_ready 1, avail 1
62 61157 [main] selectleak 8440 select_stuff::cleanup: calling cleanup routines
61 61218 [main] selectleak 8440 select_stuff::cleanup: calling cleanup routines
62 61280 [main] selectleak 8440 select_stuff::~select_stuff: deleting select records
61 61341 [main] selectleak 8440 free: (0x49AF58), called by 0x610BC2A2
226 61567 [main] selectleak 8440 cygwin_select: 1, 0x23CCFC, 0x0, 0x0, 0x0
Notice how the "calloc: (1, 12) = 49B018" is only freed once between the two
"cygwin_select: 1, 0x23CCFC, ..."-lines.
$ cygcheck -c cygwin gcc4
Cygwin Package Information
Package Version Status
cygwin 1.7.9-1 OK
gcc4 4.3.4-4 OK
Cheers,
Peter
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
- Raw text -