X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,TW_YG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Message-ID: <4DAC23E3.2020005@lysator.liu.se> Date: Mon, 18 Apr 2011 13:43:31 +0200 From: Peter Rosin User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9 MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Memory leak in select. Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Hi! Using the following STC, I'm seeing what appears to be a memory leak in select(2). ----------------8<---(selectleak.c)--------- #include #include #include 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