summaryrefslogtreecommitdiff
path: root/makedef.pl
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 /makedef.pl
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 'makedef.pl')
-rw-r--r--makedef.pl2
1 files changed, 2 insertions, 0 deletions
diff --git a/makedef.pl b/makedef.pl
index 2e4e6dcda0..dbb7f7da9d 100644
--- a/makedef.pl
+++ b/makedef.pl
@@ -455,6 +455,7 @@ unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
PL_my_cxt_list
PL_my_cxt_size
PL_my_cxt_keys
+ PL_my_cxt_keys_size
Perl_croak_nocontext
Perl_die_nocontext
Perl_deb_nocontext
@@ -536,6 +537,7 @@ unless ($define{'PERL_GLOBAL_STRUCT'}) {
unless ($define{'PERL_GLOBAL_STRUCT_PRIVATE'}) {
++$skip{$_} foreach qw(
PL_my_cxt_keys
+ PL_my_cxt_keys_size
Perl_my_cxt_index
);
}