From patchwork Fri Oct 15 16:26:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 46284 X-Patchwork-Delegate: azanella@linux.vnet.ibm.com Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B5FF3858432 for ; Fri, 15 Oct 2021 16:27:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8B5FF3858432 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1634315230; bh=f7FqW9KS5uhX4nhs9zJxrN5R9COgUXn7U/5lfmlzVDw=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Ql8iuIVOPuZaz5yQo6At/xsmWYYAzLt+EDPm7tCMq3YCB00JvjDeGce502ksadLAj SNRQRxc4g84N0gUpYsorZN/Q8zcHcYNp8KHr+MF//jWj91UsNbaIrEa1rTwNjOTVBj Z9HvD39uXA+Kd2Dayf8RyKpQKwxBPJP5t9kfydps= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by sourceware.org (Postfix) with ESMTPS id DA8A13858C60 for ; Fri, 15 Oct 2021 16:26:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DA8A13858C60 Received: by mail-yb1-xb4a.google.com with SMTP id x15-20020a056902102f00b005ba71cd7dbfso11763156ybt.8 for ; Fri, 15 Oct 2021 09:26:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=f7FqW9KS5uhX4nhs9zJxrN5R9COgUXn7U/5lfmlzVDw=; b=XelAn1f+oVMesSRtlREz83eW7sIVVFwHdqpw/KylqQONetZ6KFk/JWrLE9syByvLXL s1g9faGHurPSUIlfUH4VTTCXVmbrrlY6OFTmAqNfAIe/EQFGRRAwkNkAI9T7M7uJ0URw pmuHOHIClmuAVGRFOqAZv9dBOjKQHxF03c3lFGDTyDxCD0Lx/XFHt/XlrYjdIhF2yryO Gfm4diOSMwGLp0zb97qVMwrose/kn+9KgYDT9IANm2Zxaa+WF0tiJbB9Hpj6U3O+Atca MDIUGOcyg/VucQDiBI0TrUC/YTDDNnQBMFKWCowxXSHNA+y8GIqUZJjXROo718Q/pqLr A5KA== X-Gm-Message-State: AOAM532pKa01U/EY0Lk4dzVd60jSj6HrilvtKs8F5xAeVr0xeUw4cuea TgjtrQnoFypZzo4ARE5N4yKeYWowq5Mr7NBeLCJCrHEN+5JkX3lXN6hFZm9MdvQ6WMH3K4vJwsK Um+lkd+5XKNlUMJKGeG0hXTvWJWIv9V0r7q3N0YQ09yP64la6mk9dSTJClNuwDc1kKWGR X-Google-Smtp-Source: ABdhPJxoFXVbclOwprhM235mD65NeyV4TNNCciGis4Q99mrFBVd4QVl+61zvKDqyGNsTNFuM9dbhV3fq1cAx X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:f8af:2e0a:d1fb:5969]) (user=maskray job=sendgmr) by 2002:a25:3142:: with SMTP id x63mr11959696ybx.99.1634315207416; Fri, 15 Oct 2021 09:26:47 -0700 (PDT) Date: Fri, 15 Oct 2021 09:26:33 -0700 Message-Id: <20211015162633.550651-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH v2] nss: Unnest nested function add_key To: libc-alpha@sourceware.org X-Spam-Status: No, score=-19.6 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Fangrui Song via Libc-alpha From: Fangrui Song Reply-To: Fangrui Song Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" This makes makedb.c compilable with Clang which does not support nested functions. Reviewed-by: Adhemerval Zanella --- nss/makedb.c | 82 ++++++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/nss/makedb.c b/nss/makedb.c index 30c3d0426e..853a7e8d37 100644 --- a/nss/makedb.c +++ b/nss/makedb.c @@ -618,6 +618,45 @@ next_prime (size_t seed) return seed; } +static size_t max_chainlength; +static char *wp; +static size_t nhashentries; +static bool copy_string; + +void add_key(const void *nodep, VISIT which, void *arg) +{ + if (which != leaf && which != postorder) + return; + + const struct database *db = (const struct database *)arg; + const struct dbentry *dbe = *(const struct dbentry **) nodep; + + ptrdiff_t stridx; + if (copy_string) + { + stridx = wp - db->keystrtab; + wp = stpcpy (wp, dbe->str) + 1; + } + else + stridx = 0; + + size_t hidx = dbe->hashval % nhashentries; + size_t hval2 = 1 + dbe->hashval % (nhashentries - 2); + size_t chainlength = 0; + + while (db->hashtable[hidx] != ~((stridx_t) 0)) + { + ++chainlength; + if ((hidx += hval2) >= nhashentries) + hidx -= nhashentries; + } + + db->hashtable[hidx] = ((db->extra_string ? valstrlen : 0) + + dbe->validx); + db->keyidxtab[hidx] = stridx; + + max_chainlength = MAX (max_chainlength, chainlength); +} static void compute_tables (void) @@ -649,45 +688,6 @@ compute_tables (void) db->keyidxtab = db->hashtable + nhashentries_max; db->keystrtab = (char *) (db->keyidxtab + nhashentries_max); - static size_t max_chainlength; - static char *wp; - static size_t nhashentries; - static bool copy_string; - - void add_key(const void *nodep, const VISIT which, const int depth) - { - if (which != leaf && which != postorder) - return; - - const struct dbentry *dbe = *(const struct dbentry **) nodep; - - ptrdiff_t stridx; - if (copy_string) - { - stridx = wp - db->keystrtab; - wp = stpcpy (wp, dbe->str) + 1; - } - else - stridx = 0; - - size_t hidx = dbe->hashval % nhashentries; - size_t hval2 = 1 + dbe->hashval % (nhashentries - 2); - size_t chainlength = 0; - - while (db->hashtable[hidx] != ~((stridx_t) 0)) - { - ++chainlength; - if ((hidx += hval2) >= nhashentries) - hidx -= nhashentries; - } - - db->hashtable[hidx] = ((db->extra_string ? valstrlen : 0) - + dbe->validx); - db->keyidxtab[hidx] = stridx; - - max_chainlength = MAX (max_chainlength, chainlength); - } - copy_string = false; nhashentries = nhashentries_min; for (size_t cnt = 0; cnt < TEST_RANGE; ++cnt) @@ -697,7 +697,7 @@ compute_tables (void) max_chainlength = 0; wp = db->keystrtab; - twalk (db->entries, add_key); + twalk_r (db->entries, add_key, db); if (max_chainlength == 0) { @@ -724,7 +724,7 @@ compute_tables (void) copy_string = true; wp = db->keystrtab; - twalk (db->entries, add_key); + twalk_r (db->entries, add_key, db); db->nhashentries = nhashentries_best; nhashentries_total += nhashentries_best;