diff -pur /tmp/orig/Digest-SHA-6.02/SHA.xs /tmp/multi/Digest-SHA-6.02/SHA.xs
--- orig/Digest-SHA-6.02/SHA.xs	2018-02-25 00:54:27.000000000 +0100
+++ multi/Digest-SHA-6.02/SHA.xs	2019-11-05 04:17:41.415378152 +0100
@@ -3,6 +3,8 @@
 #include "perl.h"
 #include "XSUB.h"
 
+#include "perlmulticore.h"
+
 #ifdef SvPVbyte
 	#if PERL_REVISION == 5 && PERL_VERSION < 8
 		#undef SvPVbyte
@@ -54,6 +56,9 @@ static SHA *getSHA(pTHX_ SV *self)
 
 MODULE = Digest::SHA		PACKAGE = Digest::SHA
 
+BOOT:
+	perlmulticore_support ();
+
 PROTOTYPES: ENABLE
 
 int
@@ -145,8 +150,12 @@ PREINIT:
 CODE:
 	if (!shainit(&sha, ix2alg[ix]))
 		XSRETURN_UNDEF;
+        int release = 0;
 	for (i = 0; i < items; i++) {
+                if (release) perlinterp_acquire ();
 		data = (UCHR *) (SvPVbyte(ST(i), len));
+                release = len > 8000;
+                if (release) perlinterp_release ();
 		while (len > MAX_WRITE_SIZE) {
 			shawrite(data, MAX_WRITE_SIZE << 3, &sha);
 			data += MAX_WRITE_SIZE;
@@ -164,6 +173,7 @@ CODE:
 		result = shahex(&sha);
 	else
 		result = shabase64(&sha);
+        if (release) perlinterp_acquire ();
 	RETVAL = newSVpv(result, len);
 OUTPUT:
 	RETVAL
@@ -205,8 +215,12 @@ CODE:
 	}
 	if (hmacinit(&hmac, ix2alg[ix], key, (UINT) len) == NULL)
 		XSRETURN_UNDEF;
+        int release = 0;
 	for (i = 0; i < items - 1; i++) {
+                if (release) perlinterp_acquire ();
 		data = (UCHR *) (SvPVbyte(ST(i), len));
+                release = len > 8000;
+                if (release) perlinterp_release ();
 		while (len > MAX_WRITE_SIZE) {
 			hmacwrite(data, MAX_WRITE_SIZE << 3, &hmac);
 			data += MAX_WRITE_SIZE;
@@ -224,6 +238,7 @@ CODE:
 		result = hmachex(&hmac);
 	else
 		result = hmacbase64(&hmac);
+        if (release) perlinterp_acquire ();
 	RETVAL = newSVpv(result, len);
 OUTPUT:
 	RETVAL
@@ -256,12 +271,16 @@ PPCODE:
 		XSRETURN_UNDEF;
 	for (i = 1; i < items; i++) {
 		data = (UCHR *) (SvPVbyte(ST(i), len));
+                int release;
+                release = len > 8000;
+                if (release) perlinterp_release ();
 		while (len > MAX_WRITE_SIZE) {
 			shawrite(data, MAX_WRITE_SIZE << 3, state);
 			data += MAX_WRITE_SIZE;
 			len  -= MAX_WRITE_SIZE;
 		}
 		shawrite(data, (ULNG) len << 3, state);
+                if (release) perlinterp_acquire ();
 	}
 	XSRETURN(1);
 
Only in /tmp/multi/Digest-SHA-6.02/: SHA.xs.~1~
Only in /tmp/multi/Digest-SHA-6.02/: SHA.xs.rej
