From 272da51bfd562f5b9847c1b41eaa5d7018058490 Mon Sep 17 00:00:00 2001 From: Manuel Kress <6232639+windaishi@users.noreply.github.com> Date: Fri, 1 Mar 2024 17:47:21 +0100 Subject: [PATCH] Use ITIMER_REAL for timeout handling on MacOS / Apple Silicon system setitimer(ITIMER_PROF) fires too early on MacOS 14 when running on Apple Silicon. See https://openradar.appspot.com/radar?id=5583058442911744. Fixes GH-12814 Closes GH-13567 --- NEWS | 2 ++ Zend/zend_execute_API.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index c23dfa700e6..0d787f184e4 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ PHP NEWS - Core: . Fixed bug GH-14315 (Incompatible pointer type warnings). (Peter Kokot) + . Fixed bug GH-12814 (max_execution_time reached too early on MacOS 14 + when running on Apple Silicon). (Manuel Kress) - Curl: . Fixed bug GH-14307 (Test curl_basic_024 fails with curl 8.8.0). (nielsdos) diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index c7f814138d0..fa126f959b3 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1533,7 +1533,9 @@ static void zend_set_timeout_ex(zend_long seconds, bool reset_signals) /* {{{ */ t_r.it_value.tv_sec = seconds; t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0; -# if defined(__CYGWIN__) || defined(__PASE__) +# if defined(__CYGWIN__) || defined(__PASE__) || (defined(__aarch64__) && defined(__APPLE__)) + // ITIMER_PROF is broken in Apple Silicon system with MacOS >= 14 + // See https://openradar.appspot.com/radar?id=5583058442911744. setitimer(ITIMER_REAL, &t_r, NULL); } signo = SIGALRM; @@ -1597,7 +1599,7 @@ void zend_unset_timeout(void) /* {{{ */ no_timeout.it_value.tv_sec = no_timeout.it_value.tv_usec = no_timeout.it_interval.tv_sec = no_timeout.it_interval.tv_usec = 0; -# if defined(__CYGWIN__) || defined(__PASE__) +# if defined(__CYGWIN__) || defined(__PASE__) || (defined(__aarch64__) && defined(__APPLE__)) setitimer(ITIMER_REAL, &no_timeout, NULL); # else setitimer(ITIMER_PROF, &no_timeout, NULL);