From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.2 Received: from mother.openwall.net (mother.openwall.net [195.42.179.200]) by inbox.vuxu.org (OpenSMTPD) with SMTP id 23d25c67 for ; Wed, 4 Mar 2020 09:27:18 +0000 (UTC) Received: (qmail 32506 invoked by uid 550); 4 Mar 2020 09:27:17 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 32470 invoked from network); 4 Mar 2020 09:27:16 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+rbdzEtfKNwA79y9EuhV7SnO4VE6B+okSph03iJWpiM=; b=eb1c0WqMC5PWWr4htDfzdBVqUWKa0l0a6+JvDWT5tt2GFyar3QChov5uaAXfQ5+LDc TiyzX1/T+WeYOtJlfjotOYROmtpX5Kjgr5vt35ucBh6mxZ0RPHyhpm2m3yooyDvSP/Td HfnwFBnIOTHrHNnYEjvTh46w36np4gFR3bX/EBHwzy/leCTl2SHpI4bifceIjB2V8+NC Pm+XIJBITmnv0glknCM0vTl2K2XGTT+KF3I3/2Y31NmaeLCOuPAwwi9poNLdRfun8HEP yVcUhJ+vKztCSUKFMa7Pf/y3kB2W/BKNLd9gXlEcfHn7fM1S3pmfS2SoCkEuW6jmVHG5 blZw== X-Gm-Message-State: ANhLgQ2fK/Na6U94ZOi9N6nW4vMd8PAOnK1OvvGSR5slQx61JUv3owfv FGWMnoeuESmx1AtTW73fVvk/tzbY5006NQ== X-Google-Smtp-Source: ADFU+vvZv2AEqSTsOPve4Y6zSiSFC3qgPJ2gtu9POzjLyA1kfz0GPry6urqwtMb5OeMVfvRr6zvSFA== X-Received: by 2002:a05:6512:1041:: with SMTP id c1mr1508099lfb.14.1583314025027; Wed, 04 Mar 2020 01:27:05 -0800 (PST) From: =?UTF-8?q?Timo=20Ter=C3=A4s?= To: musl@lists.openwall.com Cc: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Wed, 4 Mar 2020 11:27:01 +0200 Message-Id: <20200304092701.19154-1-timo.teras@iki.fi> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [PATCH v2] improve strerror speed change the current O(n) lookup to O(1) based on the machinery described in "How To Write Shared Libraries" (Appendix B). --- src/errno/__strerror.h | 13 ++++++------- src/errno/strerror.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/errno/__strerror.h b/src/errno/__strerror.h index 2f04d400..2d992da5 100644 --- a/src/errno/__strerror.h +++ b/src/errno/__strerror.h @@ -1,8 +1,9 @@ -/* This file is sorted such that 'errors' which represent exceptional - * conditions under which a correct program may fail come first, followed - * by messages that indicate an incorrect program or system failure. The - * macro E() along with double-inclusion is used to ensure that ordering - * of the strings remains synchronized. */ +/* The first entry is a catch-all for codes not enumerated here. + * This file is included multiple times to declare and define a structure + * with these messages, and then to define a lookup table translating + * error codes to offsets of corresponding fields in the structure. */ + +E(0, "No error information") E(EILSEQ, "Illegal byte sequence") E(EDOM, "Domain error") @@ -101,5 +102,3 @@ E(EDQUOT, "Quota exceeded") E(ENOMEDIUM, "No medium found") E(EMEDIUMTYPE, "Wrong medium type") E(EMULTIHOP, "Multihop attempted") - -E(0, "No error information") diff --git a/src/errno/strerror.c b/src/errno/strerror.c index e3ed771a..918fbce9 100644 --- a/src/errno/strerror.c +++ b/src/errno/strerror.c @@ -1,30 +1,41 @@ #include +#include #include #include "locale_impl.h" -#define E(a,b) ((unsigned char)a), -static const unsigned char errid[] = { +/* mips has one error code outside of the 8-bit range due to a + * historical typo, so we just remap it. */ +#if EDQUOT==1133 +#define EDQUOT_ORIG 1133 +#undef EDQUOT +#define EDQUOT 109 +#endif + +static const struct errmsgstr_t { +#define E(n, s) char str##n[sizeof(s)]; +#include "__strerror.h" +#undef E +} errmsgstr = { +#define E(n, s) s, #include "__strerror.h" +#undef E }; -#undef E -#define E(a,b) b "\0" -static const char errmsg[] = +static const unsigned short errmsgidx[] = { +#define E(n, s) [n] = offsetof(struct errmsgstr_t, str##n), #include "__strerror.h" -; +#undef E +}; char *__strerror_l(int e, locale_t loc) { const char *s; - int i; - /* mips has one error code outside of the 8-bit range due to a - * historical typo, so we just remap it. */ - if (EDQUOT==1133) { - if (e==109) e=-1; - else if (e==EDQUOT) e=109; - } - for (i=0; errid[i] && errid[i] != e; i++); - for (s=errmsg; i; s++, i--) for (; *s; s++); +#ifdef EDQUOT_ORIG + if (e==EDQUOT) e=0; + else if (e==EDQUOT_ORIG) e=EDQUOT; +#endif + if ((size_t)e >= sizeof errmsgidx / sizeof *errmsgidx) e = 0; + s = (char *)&errmsgstr + errmsgidx[e]; return (char *)LCTRANS(s, LC_MESSAGES, loc); } -- 2.25.1