File fix-segfault-on-shutdown.patch of Package php7-gmagick
There seems to be a problem when the program is terminating if GraphicsMagick has been compiled
with OpenMP support and has used more than one thread. It often segfaults with PHP >= 7.4.
The solution seems to be to explicitly let OpenMP relinquish its resources before terminating.
This is only possible on GCC >= 9, as this function was not available before. On GCC < 9 the
alternative is to run in single thread mode.
Whether or not GraphicsMagick was compiled with OpenMP support, can be deterimined by adding
the output of `GraphicsMagick-config --cflags` to the CFLAGS, which will define _OPENMP in
that case.
See https://bugs.php.net/bug.php?id=78465 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91256
--- gmagick.c
+++ gmagick.c
@@ -21,6 +21,10 @@
#include "php_gmagick_macros.h"
#include "php_gmagick_helpers.h"
+#if defined(_OPENMP) && (PHP_VERSION_ID >= 70400) && (__GNUC__ >= 9)
+#include <omp.h>
+#endif
+
/* handlers */
static zend_object_handlers gmagick_object_handlers;
static zend_object_handlers gmagickdraw_object_handlers;
@@ -1709,6 +1713,9 @@ PHP_MINIT_FUNCTION(gmagick)
return FAILURE;
InitializeMagick(cwd);
+#if defined(_OPENMP) && (PHP_VERSION_ID >= 70400) && (__GNUC__ < 9)
+ SetMagickResourceLimit(ThreadsResource, 1);
+#endif
efree(cwd);
/* init constants */
@@ -1722,6 +1729,10 @@ PHP_MINIT_FUNCTION(gmagick)
PHP_MSHUTDOWN_FUNCTION(gmagick)
{
DestroyMagick();
+#if defined(_OPENMP) && (PHP_VERSION_ID >= 70400) && (__GNUC__ >= 9)
+ /* Relinquish resources used by OpenMP on all devices */
+ omp_pause_resource_all(omp_pause_hard);
+#endif
return SUCCESS;
}
/* }}} */