summaryrefslogtreecommitdiff
path: root/perlapi.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2019-02-18 09:29:29 +0000
committerDavid Mitchell <davem@iabyn.com>2019-02-19 13:28:12 +0000
commit04912be77a628a4643d16a99a332a73853926079 (patch)
tree78057c2aed6b7fb0a330616a8c235cd6c5e73346 /perlapi.h
parent61d4c87c940fea028f08f27addc275b469320fda (diff)
downloadperl-04912be77a628a4643d16a99a332a73853926079.tar.gz
fix thread issue with PERL_GLOBAL_STRUCT
The MY_CXT subsystem allows per-thread pseudo-static data storage. Part of the implementation for this involves each XS module being assigned a unique index in its my_cxt_index static var when first loaded. Because PERL_GLOBAL_STRUCT bans any static vars, under those builds there is instead a table which maps the MY_CXT_KEY identifying string to index. Unfortunately, this table was allocated per-interpreter rather than globally, meaning if multiple threads tried to load the same XS module, crashes could ensue. This manifested itself in failures in ext/XS-APItest/t/keyword_plugin_threads.t The fix is relatively straightforward: allocate PL_my_cxt_keys globally rather than per-interpreter. Also record the size of this struct in a new var, PL_my_cxt_keys_size, rather than doing double duty on PL_my_cxt_size.
Diffstat (limited to 'perlapi.h')
-rw-r--r--perlapi.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/perlapi.h b/perlapi.h
index 6eac8f72c1..66f5ac5f73 100644
--- a/perlapi.h
+++ b/perlapi.h
@@ -177,6 +177,10 @@ END_EXTERN_C
#define PL_my_ctx_mutex (*Perl_Gmy_ctx_mutex_ptr(NULL))
#undef PL_my_cxt_index
#define PL_my_cxt_index (*Perl_Gmy_cxt_index_ptr(NULL))
+#undef PL_my_cxt_keys
+#define PL_my_cxt_keys (*Perl_Gmy_cxt_keys_ptr(NULL))
+#undef PL_my_cxt_keys_size
+#define PL_my_cxt_keys_size (*Perl_Gmy_cxt_keys_size_ptr(NULL))
#undef PL_op_mutex
#define PL_op_mutex (*Perl_Gop_mutex_ptr(NULL))
#undef PL_op_seq