From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/9361 Path: news.gmane.org!not-for-mail From: Alexander Monakov Newsgroups: gmane.linux.lib.musl.general Subject: [RFC PATCH] micro-optimize __procfdname Date: Sun, 21 Feb 2016 14:41:21 +0300 (MSK) Message-ID: Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Trace: ger.gmane.org 1456054902 11348 80.91.229.3 (21 Feb 2016 11:41:42 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 21 Feb 2016 11:41:42 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-9374-gllmg-musl=m.gmane.org@lists.openwall.com Sun Feb 21 12:41:40 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1aXSOR-00087P-CY for gllmg-musl@m.gmane.org; Sun, 21 Feb 2016 12:41:39 +0100 Original-Received: (qmail 20059 invoked by uid 550); 21 Feb 2016 11:41:36 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 20017 invoked from network); 21 Feb 2016 11:41:32 -0000 User-Agent: Alpine 2.20 (LNX 67 2015-01-07) Xref: news.gmane.org gmane.linux.lib.musl.general:9361 Archived-At: Hello, I've noticed that internal function __procfdname can be slightly cleaned up by filling the supplied buffer right-to-left and returning the last filled position. The patch below implements what I have in mind, and changes one call site to demonstrate (I'll be happy to submit a patch that converts all calls, if overall this change is desirable). diff --git a/src/internal/procfdname.c b/src/internal/procfdname.c index 697e0bd..cfb3f90 100644 --- a/src/internal/procfdname.c +++ b/src/internal/procfdname.c @@ -1,13 +1,9 @@ -void __procfdname(char *buf, unsigned fd) +char *__procfdname_impl(char *buf, unsigned fd) { - unsigned i, j; - for (i=0; (buf[i] = "/proc/self/fd/"[i]); i++); - if (!fd) { - buf[i] = '0'; - buf[i+1] = 0; - return; - } - for (j=fd; j; j/=10, i++); - buf[i] = 0; - for (; fd; fd/=10) buf[--i] = '0' + fd%10; + *buf = 0; + do *--buf = '0' + fd % 10; + while (fd /= 10); + for (int i = 13; i >= 0; i--) + *--buf = "/proc/self/fd/"[i]; + return buf; } diff --git a/src/internal/procfdname.h b/src/internal/procfdname.h index e69de29..6d3c6e2 100644 --- a/src/internal/procfdname.h +++ b/src/internal/procfdname.h @@ -0,0 +1,9 @@ +#ifndef PROCFDNAME_H +#define PROCFDNAME_H + +char *__procfdname_impl(char *, unsigned); + +#define procfdbufsize sizeof "/proc/self/fd/0123456789" + (3 * (sizeof(int)-4)) +#define procfdname(buf, fd) __procfdname_impl(buf + procfdbufsize - 1, fd) + +#endif diff --git a/src/process/fexecve.c b/src/process/fexecve.c index 6507b42..88e6b9d 100644 --- a/src/process/fexecve.c +++ b/src/process/fexecve.c @@ -1,13 +1,11 @@ #include #include - -void __procfdname(char *, unsigned); +#include "procfdname.h" int fexecve(int fd, char *const argv[], char *const envp[]) { - char buf[15 + 3*sizeof(int)]; - __procfdname(buf, fd); - execve(buf, argv, envp); + char buf[procfdbufsize]; + execve(procfdname(buf, fd), argv, envp); if (errno == ENOENT) errno = EBADF; return -1; }