Received: by mail.netbsd.org (Postfix, from userid 605) id 7715784D3F; Mon, 17 Jul 2017 14:10:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by mail.netbsd.org (Postfix) with ESMTP id 0A54184D3B for ; Mon, 17 Jul 2017 14:10:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at netbsd.org Received: from mail.netbsd.org ([127.0.0.1]) by localhost (mail.netbsd.org [127.0.0.1]) (amavisd-new, port 10025) with ESMTP id fit7dmkaqamC for ; Mon, 17 Jul 2017 14:10:08 +0000 (UTC) Received: from cvs.NetBSD.org (ivanova.NetBSD.org [IPv6:2001:470:a085:999:28c:faff:fe03:5984]) by mail.netbsd.org (Postfix) with ESMTP id 4EF6B84D32 for ; Mon, 17 Jul 2017 14:10:08 +0000 (UTC) Received: by cvs.NetBSD.org (Postfix, from userid 500) id 45870FACD; Mon, 17 Jul 2017 14:10:08 +0000 (UTC) Content-Transfer-Encoding: 7bit Content-Type: multipart/mixed; boundary="_----------=_1500300608184950" MIME-Version: 1.0 Date: Mon, 17 Jul 2017 14:10:08 +0000 From: "Emmanuel Dreyfus" Subject: CVS commit: pkgsrc/lang/php71 To: pkgsrc-changes@NetBSD.org Reply-To: manu@netbsd.org X-Mailer: log_accum Message-Id: <20170717141008.45870FACD@cvs.NetBSD.org> Sender: pkgsrc-changes-owner@NetBSD.org List-Id: pkgsrc-changes.NetBSD.org Precedence: bulk List-Unsubscribe: This is a multi-part message in MIME format. --_----------=_1500300608184950 Content-Disposition: inline Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" Module Name: pkgsrc Committed By: manu Date: Mon Jul 17 14:10:08 UTC 2017 Modified Files: pkgsrc/lang/php71: distinfo Added Files: pkgsrc/lang/php71/patches: patch-ext_standard_uniqid.c Log Message: Performance fix for uniqid() PHP uniqid() relies on microsecond-precise system clock to produce an unique identifier. In order to avoid using the same value, it first calls usleep(1) to wait for the next microsecond. Unfortunately, usleep() specification says "The suspension time may be longer than requested due to the scheduling of other activity by the system." Indeed, the pause may as as long as an entire execution slice, causing a uniqid() call to last more than 10 ms. This is fixed by replacing the usleep() call by time polling using gettimeofday() until the microscecond change. Since the getttimeoday() system call lasts around a microsecond, only a small time is wasted calling multiple gettimeofday. On the benefit side, uniqid() performance in increased 10000 fold without changing its behavior. Submitted upstream as https://bugs.php.net/bug.php?id=74851 To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 pkgsrc/lang/php71/distinfo cvs rdiff -u -r0 -r1.1 pkgsrc/lang/php71/patches/patch-ext_standard_uniqid.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. --_----------=_1500300608184950 Content-Disposition: inline Content-Length: 3731 Content-Transfer-Encoding: binary Content-Type: text/x-diff; charset=us-ascii Modified files: Index: pkgsrc/lang/php71/distinfo diff -u pkgsrc/lang/php71/distinfo:1.23 pkgsrc/lang/php71/distinfo:1.24 --- pkgsrc/lang/php71/distinfo:1.23 Fri Jul 7 03:12:22 2017 +++ pkgsrc/lang/php71/distinfo Mon Jul 17 14:10:08 2017 @@ -1,4 +1,4 @@ -$NetBSD: distinfo,v 1.23 2017/07/07 03:12:22 taca Exp $ +$NetBSD: distinfo,v 1.24 2017/07/17 14:10:08 manu Exp $ SHA1 (php-7.1.7.tar.bz2) = 1d7112102e79b052ebc47e3fd90ad24ddcfb8394 RMD160 (php-7.1.7.tar.bz2) = bcba338427733569b3be8ed27c5dba2afc3fca80 @@ -17,6 +17,7 @@ SHA1 (patch-ext_phar_phar_phar.php) = f6 SHA1 (patch-ext_recode_recode.c) = a97a1815d6a41410f68c289debbb9396128a2159 SHA1 (patch-ext_sqlite3_libsqlite_sqlite3.c) = 8a529a1b3f7c97731f2e719d006f67c3a7259bb5 SHA1 (patch-ext_standard_basic__functions.c) = f97a2748c7b15fbd9a2d3c21e56079088cc05d56 +SHA1 (patch-ext_standard_uniqid.c) = feefb8c6e601dee690d2ae99443e285136ef7224 SHA1 (patch-ext_xsl_php__xsl.h) = a9877bff7bacc77926a4541a0ac171c00ad1a627 SHA1 (patch-makedist) = 2ac0e0391c031c4fcf4993e2269cde4c6bfddfd5 SHA1 (patch-php.ini-development) = dd65962000ec06439fae3c9bf252fa46be4e33fd Added files: Index: pkgsrc/lang/php71/patches/patch-ext_standard_uniqid.c diff -u /dev/null pkgsrc/lang/php71/patches/patch-ext_standard_uniqid.c:1.1 --- /dev/null Mon Jul 17 14:10:08 2017 +++ pkgsrc/lang/php71/patches/patch-ext_standard_uniqid.c Mon Jul 17 14:10:08 2017 @@ -0,0 +1,62 @@ +$NetBSD: patch-ext_standard_uniqid.c,v 1.1 2017/07/17 14:10:08 manu Exp $ + +PHP uniqid() relies on microsecond-precise system clock to produce an +unique identifier. In order to avoid using the same value, it first +calls usleep(1) to wait for the next microsecond. + +Unfortunately, usleep() specification says "The suspension time may be +longer than requested due to the scheduling of other activity by the +system." Indeed, the pause may as as long as an entire execution slice, +causing a uniqid() call to last more than 10 ms. + +This is fixed by replacing the usleep() call by time polling using +gettimeofday() until the microscecond change. Since the getttimeoday() +system call lasts around a microsecond, only a small time is wasted +calling multiple gettimeofday. On the benefit side, uniqid() performance +in increased 10000 fold without changing its behavior. + +Submitted upstream as https://bugs.php.net/bug.php?id=74851 + +--- ext/standard/uniqid.c.orig 2017-06-07 10:09:31.000000000 +0200 ++++ ext/standard/uniqid.c 2017-07-08 08:24:24.000000000 +0200 +@@ -52,25 +52,31 @@ + zend_string *uniqid; + int sec, usec; + size_t prefix_len = 0; + struct timeval tv; ++ static struct timeval prev_tv = { 0, 0 }; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sb", &prefix, &prefix_len, + &more_entropy)) { + return; + } + +-#if HAVE_USLEEP && !defined(PHP_WIN32) + if (!more_entropy) { +-#if defined(__CYGWIN__) +- php_error_docref(NULL, E_WARNING, "You must use 'more entropy' under CYGWIN"); +- RETURN_FALSE; +-#else +- usleep(1); +-#endif ++ /* This implementation needs current microsecond to change, ++ * hence we poll time until it does. This is much faster than ++ * calling usleep(1) which may cause the kernel to schedule ++ * another process, causing a pause of around 10ms. ++ */ ++ do { ++ (void)gettimeofday((struct timeval *) &tv, ++ (struct timezone *) NULL); ++ } while (tv.tv_sec == prev_tv.tv_sec && ++ tv.tv_usec == prev_tv.tv_usec); ++ ++ prev_tv.tv_sec = tv.tv_sec; ++ prev_tv.tv_usec = tv.tv_usec; + } +-#endif +- gettimeofday((struct timeval *) &tv, (struct timezone *) NULL); ++ + sec = (int) tv.tv_sec; + usec = (int) (tv.tv_usec % 0x100000); + + /* The max value usec can have is 0xF423F, so we use only five hex --_----------=_1500300608184950--