diff options
-rw-r--r-- | b29c54505a93365441fa140b152a651c3b9324c2.patch | 287 | ||||
-rw-r--r-- | php-pecl-imagick.spec | 26 |
2 files changed, 310 insertions, 3 deletions
diff --git a/b29c54505a93365441fa140b152a651c3b9324c2.patch b/b29c54505a93365441fa140b152a651c3b9324c2.patch new file mode 100644 index 0000000..4d4ba4d --- /dev/null +++ b/b29c54505a93365441fa140b152a651c3b9324c2.patch @@ -0,0 +1,287 @@ +From b29c54505a93365441fa140b152a651c3b9324c2 Mon Sep 17 00:00:00 2001 +From: Danack <Danack@basereality.com> +Date: Tue, 30 Jul 2019 15:20:15 +0100 +Subject: [PATCH] Add ini settings to work around segfault. + +Added the 'imagick.shutdown_sleep_count' (default 10) and 'imagick.set_single_thread' (default Off) to work around a segfault in OpenMP. +--- + imagick.c | 22 ++++++++++++- + package.xml | 5 +++ + php_imagick_defs.h | 4 +++ + tests/281_ini_settings_default.phpt | 29 ++++++++++++++++ + tests/282_ini_settings_set_falsy_string.phpt | 33 +++++++++++++++++++ + tests/283_ini_settings_set_falsy_zero.phpt | 33 +++++++++++++++++++ + tests/284_ini_settings_set_truthy_number.phpt | 33 +++++++++++++++++++ + tests/285_ini_settings_set_truthy_string.phpt | 33 +++++++++++++++++++ + 8 files changed, 191 insertions(+), 1 deletion(-) + create mode 100644 tests/281_ini_settings_default.phpt + create mode 100644 tests/282_ini_settings_set_falsy_string.phpt + create mode 100644 tests/283_ini_settings_set_falsy_zero.phpt + create mode 100644 tests/284_ini_settings_set_truthy_number.phpt + create mode 100644 tests/285_ini_settings_set_truthy_string.phpt + +diff --git a/imagick.c b/imagick.c +index 8e58afe..be6b303 100644 +--- a/imagick.c ++++ b/imagick.c +@@ -3262,6 +3262,10 @@ PHP_INI_BEGIN() + STD_PHP_INI_ENTRY("imagick.locale_fix", "0", PHP_INI_ALL, OnUpdateBool, locale_fix, zend_imagick_globals, imagick_globals) + STD_PHP_INI_ENTRY("imagick.skip_version_check", "0", PHP_INI_ALL, OnUpdateBool, skip_version_check, zend_imagick_globals, imagick_globals) + STD_PHP_INI_ENTRY("imagick.progress_monitor", "0", PHP_INI_SYSTEM, OnUpdateBool, progress_monitor, zend_imagick_globals, imagick_globals) ++ ++ STD_PHP_INI_ENTRY("imagick.set_single_thread", "0", PHP_INI_SYSTEM, OnUpdateBool, set_single_thread, zend_imagick_globals, imagick_globals) ++ STD_PHP_INI_ENTRY("imagick.shutdown_sleep_count", "10", PHP_INI_ALL, OnUpdateLong, shutdown_sleep_count, zend_imagick_globals, imagick_globals) ++ + PHP_INI_END() + + static void php_imagick_init_globals(zend_imagick_globals *imagick_globals) +@@ -3269,6 +3273,9 @@ static void php_imagick_init_globals(zend_imagick_globals *imagick_globals) + imagick_globals->locale_fix = 0; + imagick_globals->progress_monitor = 0; + imagick_globals->skip_version_check = 0; ++ imagick_globals->set_single_thread = 0; ++ // 10 is magick number, that seems to be enough. ++ imagick_globals->shutdown_sleep_count = 10; + } + + +@@ -3748,6 +3755,10 @@ PHP_MINIT_FUNCTION(imagick) + checkImagickVersion(); + } + ++ if (IMAGICK_G(set_single_thread)) { ++ MagickSetResourceLimit(ThreadResource, 1); ++ } ++ + return SUCCESS; + } + +@@ -3824,12 +3835,21 @@ PHP_MINFO_FUNCTION(imagick) + + PHP_MSHUTDOWN_FUNCTION(imagick) + { ++ int i; ++ + // This suppresses an 'unused parameter' warning. + (void)type; + +- + MagickWandTerminus(); + ++ // Sleep for a bit to hopefully allow OpenMP to ++ // shut down the threads it created, and avoid a segfault ++ // This hack won't be needed once everyone is compiling ImageMagick ++ // against a version of OpenMP that has omp_pause_resource_all() ++ for (i = 0; i < 100 && i < IMAGICK_G(shutdown_sleep_count); i += 1) { ++ usleep(1000); ++ } ++ + #if defined(ZTS) && defined(PHP_WIN32) + tsrm_mutex_free(imagick_mutex); + #endif +diff --git a/php_imagick_defs.h b/php_imagick_defs.h +index 5eb57e5..dbc9c52 100644 +--- a/php_imagick_defs.h ++++ b/php_imagick_defs.h +@@ -83,6 +83,10 @@ ZEND_BEGIN_MODULE_GLOBALS(imagick) + zend_bool locale_fix; + zend_bool progress_monitor; + zend_bool skip_version_check; ++ ++ zend_bool set_single_thread; ++ zend_long shutdown_sleep_count; ++ + php_imagick_callback *progress_callback; + #ifdef PHP_IMAGICK_ZEND_MM + MagickWand *keep_alive; +diff --git a/tests/281_ini_settings_default.phpt b/tests/281_ini_settings_default.phpt +new file mode 100644 +index 0000000..e397e98 +--- /dev/null ++++ b/tests/281_ini_settings_default.phpt +@@ -0,0 +1,29 @@ ++--TEST-- ++OpenMP segfault hacks ++--SKIPIF-- ++<?php ++ ++ ++require_once(dirname(__FILE__) . '/skipif.inc'); ++ ++?> ++--FILE-- ++<?php ++ ++ ++$sleepCount = ini_get('imagick.shutdown_sleep_count'); ++$setSingleThread = ini_get('imagick.set_single_thread'); ++ ++if ($sleepCount != 10) { ++ echo "imagick.shutdown_sleep_count is not set to 10 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++if ($setSingleThread != 0) { ++ echo "imagick.set_single_thread setting is not false but instead " . var_export($setSingleThread, true) ."\n"; ++} ++ ++ ++echo "Complete".PHP_EOL; ++?> ++--EXPECTF-- ++Complete +diff --git a/tests/282_ini_settings_set_falsy_string.phpt b/tests/282_ini_settings_set_falsy_string.phpt +new file mode 100644 +index 0000000..c5f6bfd +--- /dev/null ++++ b/tests/282_ini_settings_set_falsy_string.phpt +@@ -0,0 +1,33 @@ ++--TEST-- ++OpenMP segfault hacks ++ ++--INI-- ++imagick.shutdown_sleep_count=Off ++imagick.set_single_thread=0 ++--SKIPIF-- ++<?php ++ ++ ++require_once(dirname(__FILE__) . '/skipif.inc'); ++ ++?> ++--FILE-- ++<?php ++ ++ ++$sleepCount = ini_get('imagick.shutdown_sleep_count'); ++$setSingleThread = ini_get('imagick.set_single_thread'); ++ ++if ($sleepCount != 0) { ++ echo "imagick.shutdown_sleep_count is not set to 0 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++if ($setSingleThread != 0) { ++ echo "imagick.set_single_thread setting is not 0 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++ ++echo "Complete".PHP_EOL; ++?> ++--EXPECTF-- ++Complete +diff --git a/tests/283_ini_settings_set_falsy_zero.phpt b/tests/283_ini_settings_set_falsy_zero.phpt +new file mode 100644 +index 0000000..8e41a35 +--- /dev/null ++++ b/tests/283_ini_settings_set_falsy_zero.phpt +@@ -0,0 +1,33 @@ ++--TEST-- ++OpenMP segfault hacks ++ ++--INI-- ++imagick.shutdown_sleep_count=0 ++imagick.set_single_thread=0 ++--SKIPIF-- ++<?php ++ ++ ++require_once(dirname(__FILE__) . '/skipif.inc'); ++ ++?> ++--FILE-- ++<?php ++ ++ ++$sleepCount = ini_get('imagick.shutdown_sleep_count'); ++$setSingleThread = ini_get('imagick.set_single_thread'); ++ ++if ($sleepCount != 0) { ++ echo "imagick.shutdown_sleep_count is not set to 10 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++if ($setSingleThread != 0) { ++ echo "imagick.set_single_thread setting is not false but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++ ++echo "Complete".PHP_EOL; ++?> ++--EXPECTF-- ++Complete +diff --git a/tests/284_ini_settings_set_truthy_number.phpt b/tests/284_ini_settings_set_truthy_number.phpt +new file mode 100644 +index 0000000..fc0a0bb +--- /dev/null ++++ b/tests/284_ini_settings_set_truthy_number.phpt +@@ -0,0 +1,33 @@ ++--TEST-- ++OpenMP segfault hacks ++ ++--INI-- ++imagick.shutdown_sleep_count=20 ++imagick.set_single_thread=1 ++--SKIPIF-- ++<?php ++ ++ ++require_once(dirname(__FILE__) . '/skipif.inc'); ++ ++?> ++--FILE-- ++<?php ++ ++ ++$sleepCount = intval(ini_get('imagick.shutdown_sleep_count')); ++$setSingleThread = ini_get('imagick.set_single_thread'); ++ ++if ($sleepCount != 20) { ++ echo "imagick.shutdown_sleep_count is not set to 10 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++if ($setSingleThread != 1) { ++ echo "imagick.set_single_thread setting is not true but instead " . var_export($setSingleThread, true) ."\n"; ++} ++ ++ ++echo "Complete".PHP_EOL; ++?> ++--EXPECTF-- ++Complete +diff --git a/tests/285_ini_settings_set_truthy_string.phpt b/tests/285_ini_settings_set_truthy_string.phpt +new file mode 100644 +index 0000000..c35a213 +--- /dev/null ++++ b/tests/285_ini_settings_set_truthy_string.phpt +@@ -0,0 +1,33 @@ ++--TEST-- ++OpenMP segfault hacks ++ ++--INI-- ++imagick.shutdown_sleep_count=On ++imagick.set_single_thread=On ++--SKIPIF-- ++<?php ++ ++ ++require_once(dirname(__FILE__) . '/skipif.inc'); ++ ++?> ++--FILE-- ++<?php ++ ++ ++$sleepCount = intval(ini_get('imagick.shutdown_sleep_count')); ++$setSingleThread = ini_get('imagick.set_single_thread'); ++ ++if ($sleepCount != 1) { ++ echo "imagick.shutdown_sleep_count is not set to 1 but instead " . var_export($sleepCount, true) ."\n"; ++} ++ ++if ($setSingleThread != 1) { ++ echo "imagick.set_single_thread setting is not true but instead " . var_export($setSingleThread, true) ."\n"; ++} ++ ++ ++echo "Complete".PHP_EOL; ++?> ++--EXPECTF-- ++Complete diff --git a/php-pecl-imagick.spec b/php-pecl-imagick.spec index 79297a9..f94c157 100644 --- a/php-pecl-imagick.spec +++ b/php-pecl-imagick.spec @@ -40,7 +40,7 @@ Version: %{upstream_version}%{?upstream_prever:~%{upstream_prever}} Release: 0.8.%{gh_date}git%{gh_short}%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit}/%{pecl_name}-%{version}-%{gh_short}.tar.gz %else -Release: 7%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Release: 8%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} Source0: http://pecl.php.net/get/%{pecl_name}-%{upstream_version}%{?upstream_prever}.tgz %endif License: PHP @@ -50,6 +50,7 @@ Patch0: https://patch-diff.githubusercontent.com/raw/Imagick/imagick/pull Patch1: https://patch-diff.githubusercontent.com/raw/Imagick/imagick/pull/291.patch Patch2: https://patch-diff.githubusercontent.com/raw/Imagick/imagick/pull/296.patch Patch3: https://patch-diff.githubusercontent.com/raw/Imagick/imagick/pull/302.patch +Patch4: https://github.com/Imagick/imagick/commit/b29c54505a93365441fa140b152a651c3b9324c2.patch BuildRequires: %{?dtsprefix}gcc BuildRequires: %{?scl_prefix}php-devel > 5.4 @@ -168,9 +169,10 @@ cd NTS %patch0 -p1 %patch1 -p1 %if "%{php_version}" > "7.4" -%patch2 -p1 +#patch2 -p1 %endif %patch3 -p1 +%patch4 -p1 extver=$(sed -n '/#define PHP_IMAGICK_VERSION/{s/.* "//;s/".*$//;p}' php_imagick.h) if test "x${extver}" != "x%{upstream_version}%{?upstream_prever}"; then @@ -186,13 +188,24 @@ extension = %{pecl_name}.so ; Documentation: http://php.net/imagick ; Don't check builtime and runtime versions of ImageMagick +; Default value:0 imagick.skip_version_check=1 ; Fixes a drawing bug with locales that use ',' as float separators. +; Default value:0 ;imagick.locale_fix=0 ; Used to enable the image progress monitor. +; Default value:0 ;imagick.progress_monitor=0 + +; Allow or disallow ImageMagick to use multiple threads +; Default value:0 +imagick.set_single_thread=1 + +; Hack to ensure all threads have ended +; Default value:10 +imagick.shutdown_sleep_count=0 EOF %if %{with_zts} @@ -271,6 +284,8 @@ export REPORT_EXIT_STATUS=1 # very long, and erratic results, sometime timeout rm ?TS/tests/229_Tutorial_fxAnalyzeImage_case1.phpt +# as we force set_single_thread +rm ?TS/tests/281_ini_settings_default.phpt : simple module load test for NTS extension cd NTS @@ -281,7 +296,7 @@ cd NTS : upstream test suite for NTS extension TEST_PHP_EXECUTABLE=%{__php} \ -TEST_PHP_ARGS="-n -d extension=%{buildroot}%{php_extdir}/%{pecl_name}.so" \ +TEST_PHP_ARGS="-n -d extension=%{buildroot}%{php_extdir}/%{pecl_name}.so -d imagick.set_single_thread=1 -d imagick.shutdown_sleep_count=0" \ %{__php} -n run-tests.php -q --show-diff %if %{with_zts} @@ -317,6 +332,11 @@ cd ../ZTS %changelog +* Mon Nov 25 2019 Remi Collet <remi@remirepo.net> - 3.4.4-8 +- add upstream patch to workaround #295 instead of PR#296 +- set new option imagick.set_single_thread to 1 +- set new option imagick.shutdown_sleep_count to 0 + * Tue Oct 29 2019 Remi Collet <remi@remirepo.net> - 3.4.4-7 - add patch for latest ImageMagick from https://github.com/Imagick/imagick/pull/302 |