2020#endif
2121#ifdef HAS_PPPORT_H
2222# define NEED_PL_signals
23+ # define NEED_newRV_noinc
2324# define NEED_sv_2pv_flags
2425# include "ppport.h"
2526# include "threads.h"
3536# endif
3637#endif
3738
39+ #if PERL_VERSION < 28
40+ #define thread_locale_init ()
41+ #define thread_locale_term ()
42+ #endif
43+
44+ #ifndef CLANG_DIAG_IGNORE
45+ # define CLANG_DIAG_IGNORE (x )
46+ # define CLANG_DIAG_RESTORE
47+ #endif
48+ #ifndef CLANG_DIAG_IGNORE_STMT
49+ # define CLANG_DIAG_IGNORE_STMT (x ) CLANG_DIAG_IGNORE(x) NOOP
50+ # define CLANG_DIAG_RESTORE_STMT CLANG_DIAG_RESTORE NOOP
51+ # define CLANG_DIAG_IGNORE_DECL (x ) CLANG_DIAG_IGNORE(x) dNOOP
52+ # define CLANG_DIAG_RESTORE_DECL CLANG_DIAG_RESTORE dNOOP
53+ #endif
54+
3855#ifdef USE_ITHREADS
3956
4057#ifdef __amigaos4__
@@ -132,9 +149,9 @@ typedef struct {
132149 IV page_size ;
133150} my_pool_t ;
134151
135- #define dMY_POOL \
136- SV *my_pool_sv = *hv_fetch(PL_modglobal, MY_POOL_KEY, \
137- sizeof(MY_POOL_KEY)-1, TRUE); \
152+ #define dMY_POOL \
153+ SV *my_pool_sv = *hv_fetch(PL_modglobal, MY_POOL_KEY, \
154+ sizeof(MY_POOL_KEY)-1, TRUE); \
138155 my_pool_t *my_poolp = INT2PTR(my_pool_t*, SvUV(my_pool_sv))
139156
140157#define MY_POOL_set \
@@ -219,7 +236,7 @@ S_ithread_clear(pTHX_ ithread *thread)
219236{
220237 PerlInterpreter * interp ;
221238#ifndef WIN32
222- sigset_t origmask ;
239+ static sigset_t origmask ;
223240#endif
224241
225242 assert (((thread -> state & PERL_ITHR_FINISHED ) &&
@@ -583,6 +600,8 @@ S_ithread_run(void * arg)
583600 S_set_sigmask (& thread -> initial_sigmask );
584601#endif
585602
603+ thread_locale_init ();
604+
586605 PL_perl_destruct_level = 2 ;
587606
588607 {
@@ -668,6 +687,8 @@ S_ithread_run(void * arg)
668687 MUTEX_UNLOCK (& thread -> mutex );
669688 MUTEX_UNLOCK (& MY_POOL .create_destruct_mutex );
670689
690+ thread_locale_term ();
691+
671692 /* Exit application if required */
672693 if (exit_app ) {
673694 (void )S_jmpenv_run (aTHX_ 2 , thread , NULL , & exit_app , & exit_code );
@@ -884,15 +905,18 @@ S_ithread_create(
884905 reallocated (and hence move) as a side effect of calls to
885906 perl_clone() and sv_dup_inc(). Hence copy the parameters
886907 somewhere under our control first, before duplicating. */
908+ if (num_params ) {
887909#if (PERL_VERSION > 8 )
888- Copy (parent_perl -> Istack_base + params_start , array , num_params , SV * );
910+ Copy (parent_perl -> Istack_base + params_start , array , num_params , SV * );
889911#else
890- Copy (parent_perl -> Tstack_base + params_start , array , num_params , SV * );
912+ Copy (parent_perl -> Tstack_base + params_start , array , num_params , SV * );
891913#endif
892- while (num_params -- ) {
893- * array = sv_dup_inc (* array , clone_param );
894- ++ array ;
914+ while (num_params -- ) {
915+ * array = sv_dup_inc (* array , clone_param );
916+ ++ array ;
917+ }
895918 }
919+
896920#if (PERL_VERSION > 13 ) || (PERL_VERSION == 13 && PERL_SUBVERSION > 1 )
897921 Perl_clone_params_del (clone_param );
898922#endif
@@ -1030,15 +1054,10 @@ S_ithread_create(
10301054 MUTEX_UNLOCK (& my_pool -> create_destruct_mutex );
10311055 return (thread );
10321056
1033- #if defined(CLANG_DIAG_IGNORE )
1034- CLANG_DIAG_IGNORE (- Wthread - safety );
1057+ CLANG_DIAG_IGNORE_STMT (- Wthread - safety );
10351058 /* warning: mutex 'thread->mutex' is not held on every path through here [-Wthread-safety-analysis] */
1036- #endif
10371059}
1038- /* perl.h defines CLANG_DIAG_* but only in 5.24+ */
1039- #if defined(CLANG_DIAG_RESTORE )
1040- CLANG_DIAG_RESTORE
1041- #endif
1060+ CLANG_DIAG_RESTORE_DECL ;
10421061
10431062#endif /* USE_ITHREADS */
10441063
@@ -1161,6 +1180,7 @@ ithread_create(...)
11611180 }
11621181
11631182 /* Create thread */
1183+ /* Unlocked inside S_ithread_create */
11641184 MUTEX_LOCK (& MY_POOL .create_destruct_mutex );
11651185 thread = S_ithread_create (aTHX_ & MY_POOL ,
11661186 function_to_call ,
@@ -1176,10 +1196,10 @@ ithread_create(...)
11761196
11771197 /* Let thread run. */
11781198 /* See S_ithread_run() for more detail. */
1179- CLANG_DIAG_IGNORE (- Wthread - safety );
1199+ CLANG_DIAG_IGNORE_STMT (- Wthread - safety );
11801200 /* warning: releasing mutex 'thread->mutex' that was not held [-Wthread-safety-analysis] */
11811201 MUTEX_UNLOCK (& thread -> mutex );
1182- CLANG_DIAG_RESTORE ;
1202+ CLANG_DIAG_RESTORE_STMT ;
11831203
11841204 /* XSRETURN(1); - implied */
11851205
@@ -1374,6 +1394,9 @@ ithread_join(...)
13741394 ptr_table_store (PL_ptr_table , & other_perl -> Isv_undef , & PL_sv_undef );
13751395 ptr_table_store (PL_ptr_table , & other_perl -> Isv_no , & PL_sv_no );
13761396 ptr_table_store (PL_ptr_table , & other_perl -> Isv_yes , & PL_sv_yes );
1397+ # ifdef PL_sv_zero
1398+ ptr_table_store (PL_ptr_table , & other_perl -> Isv_zero , & PL_sv_zero );
1399+ # endif
13771400 params = (AV * )sv_dup ((SV * )params_copy , clone_params );
13781401 S_ithread_set (aTHX_ current_thread );
13791402 Perl_clone_params_del (clone_params );
@@ -1802,6 +1825,9 @@ ithread_error(...)
18021825 ptr_table_store (PL_ptr_table , & other_perl -> Isv_undef , & PL_sv_undef );
18031826 ptr_table_store (PL_ptr_table , & other_perl -> Isv_no , & PL_sv_no );
18041827 ptr_table_store (PL_ptr_table , & other_perl -> Isv_yes , & PL_sv_yes );
1828+ # ifdef PL_sv_zero
1829+ ptr_table_store (PL_ptr_table , & other_perl -> Isv_zero , & PL_sv_zero );
1830+ # endif
18051831 err = sv_dup (thread -> err , clone_params );
18061832 S_ithread_set (aTHX_ current_thread );
18071833 Perl_clone_params_del (clone_params );
@@ -1834,7 +1860,6 @@ BOOT:
18341860 SV * my_pool_sv = * hv_fetch (PL_modglobal , MY_POOL_KEY ,
18351861 sizeof (MY_POOL_KEY )- 1 , TRUE);
18361862 my_pool_t * my_poolp = (my_pool_t * )SvPVX (newSV (sizeof (my_pool_t )- 1 ));
1837-
18381863 MY_CXT_INIT ;
18391864
18401865 Zero (my_poolp , 1 , my_pool_t );
0 commit comments