From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21563 invoked by alias); 18 Apr 2011 12:23:43 -0000 Received: (qmail 21540 invoked by uid 22791); 18 Apr 2011 12:23:39 -0000 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 Received: from mail.lysator.liu.se (HELO mail.lysator.liu.se) (130.236.254.3) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 18 Apr 2011 12:23:20 +0000 Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id C6B7540012 for ; Mon, 18 Apr 2011 14:23:18 +0200 (CEST) Received: from [192.168.0.33] (h57n3fls301o1095.telia.com [81.230.178.57]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPSA id 9D7E44000E for ; Mon, 18 Apr 2011 14:23:18 +0200 (CEST) Message-ID: <4DAC2D35.5070106@lysator.liu.se> Date: Mon, 18 Apr 2011 15:03:00 -0000 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@cygwin.com Subject: Re: Memory leak in select References: <4DAC23E3.2020005@lysator.liu.se> In-Reply-To: <4DAC23E3.2020005@lysator.liu.se> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com X-SW-Source: 2011-04/txt/msg00239.txt.bz2 Den 2011-04-18 13:43 skrev Peter Rosin: > 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 Arrrg, this is the program I actually used to generate that strace (but the leak is present in both versions). Oh well, sorry about that... ----------------8<---(selectleak.c)--------- #include #include int main(void) { fd_set fdset; 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); res = select(1, &fdset, NULL, NULL, NULL); if (!res) continue; if (res < 0) return 1; res = read(0, buf, sizeof(buf)); if (!res) break; if (res < 0) return 1; } return 0; } ----------------8<-------------------------- -- 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