From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 106494 invoked by alias); 24 Mar 2015 16:36:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 105477 invoked by uid 89); 24 Mar 2015 16:36:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 24 Mar 2015 16:36:52 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t2OGaopS031230 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 24 Mar 2015 12:36:50 -0400 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t2OGand4012796; Tue, 24 Mar 2015 12:36:50 -0400 Message-ID: <551192A0.3070107@redhat.com> Date: Tue, 24 Mar 2015 16:36:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Gary Benson CC: gdb-patches@sourceware.org Subject: Re: [PATCH v2] Associate target_ops with target_fileio file descriptors References: <20150318184538.GA32134@blade.nx> <1426867612-32278-1-git-send-email-gbenson@redhat.com> <5511651F.4050400@redhat.com> <20150324161752.GA10601@blade.nx> In-Reply-To: <20150324161752.GA10601@blade.nx> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2015-03/txt/msg00797.txt.bz2 On 03/24/2015 04:17 PM, Gary Benson wrote: > Pedro Alves wrote: >> On 03/20/2015 04:06 PM, Gary Benson wrote: >>> + >>> + /* Search for closed handles to reuse. */ >>> + if (lowest_closed_fd >= 0) >>> + { >>> + for (index = lowest_closed_fd; >>> + VEC_iterate (fileio_fh_t, fileio_fhandles, index, fh); >>> + index++) >>> + if (is_closed_fileio_fh (fh->fd)) >>> + break; >> >> You don't really need 'index'. If this walks using >> lowest_closed_fd instead, like: >> >> for (; >> VEC_iterate (fileio_fh_t, fileio_fhandles, >> lowest_closed_fd, fh); >> lowest_closed_fd++) >> if (is_closed_fileio_fh (fh->fd)) >> break; >> >> Then the next time around we skip slots we already know are >> open. >> >>> + } >>> + >>> + /* Push a new handle if no closed handles were found. */ >>> + if (index == total) >>> + { >>> + fh = VEC_safe_push (fileio_fh_t, fileio_fhandles, NULL); >>> + lowest_closed_fd = -1; >>> + } >>> + >>> + /* Fill in the handle and return its index. */ >>> + fh->t = t; >>> + fh->fd = fd; >>> + >>> + return index; >>> +} > > You do need another variable though. The function returns the > index of the file handle it just used, so you need to save that > across the bit that sets lowest_closed_fd to -1. I rearranged > things to this, but it's longer and I'd argue harder to follow: We can get the index with VEC_address. And if we get rid of the -1 state, things get event simpler, and release_fileio_fd can be simplified too, like this (untested): /* Index into fileio_fhandles of the lowest handle that might be closed. This permits handle reuse without searching the whole list each time a new file is opened. */ static int lowest_closed_fd = 0; static int acquire_fileio_fd (struct target_ops *t, int fd) { fileio_fh_t *fh, buf; gdb_assert (!is_closed_fileio_fh (fd)); /* Search for closed handles to reuse. */ for (; VEC_iterate (fileio_fh_t, fileio_fhandles, lowest_closed_fd, fh); lowest_closed_fd++) if (is_closed_fileio_fh (fh->fd)) break; /* Push a new handle if no closed handles were found. */ if (lowest_closed_fd == VEC_length (fileio_fh_t, fileio_fhandles)) { fh = VEC_safe_push (fileio_fh_t, fileio_fhandles, NULL); lowest_closed_fd++; } /* Fill in the handle. */ fh->t = t; fh->fd = fd; /* Return its index. */ return fh - VEC_address (fileio_fh_t, fileio_fhandles); } static void release_fileio_fd (int fd, fileio_fh_t *fh) { fh->fd = -1; lowest_closed_fd = min (lowest_closed_fd, fd); } Thanks, Pedro Alves