This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix thread issue with PERL_GLOBAL_STRUCT
authorDavid Mitchell <davem@iabyn.com>
Mon, 18 Feb 2019 09:29:29 +0000 (09:29 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 19 Feb 2019 13:28:12 +0000 (13:28 +0000)
commit04912be77a628a4643d16a99a332a73853926079
tree78057c2aed6b7fb0a330616a8c235cd6c5e73346
parent61d4c87c940fea028f08f27addc275b469320fda
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.
embedvar.h
intrpvar.h
makedef.pl
perlapi.h
perlvars.h
sv.c
util.c