PERL_GLOBAL_STRUCT threads issue
authorDavid Mitchell <davem@iabyn.com>
Tue, 8 Apr 2014 22:22:23 +0000 (23:22 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 9 Apr 2014 08:10:35 +0000 (09:10 +0100)
commitc1181d2b3683ac74700fde40596ed2533780b9b4
tree1158ff9d0f114f86099e7189e833f1d3f947aca1
parentf6f3144e6da4f2db1df4ac0fd75ae0e2f166b4e6
PERL_GLOBAL_STRUCT threads issue

A test in op/threads.t roughly equivalent to this:

    use threads;
    sub f {};
    async \&f;

was randomly failing smokes under the combination of PERL_GLOBAL_STRUCT and
ASan.

This is due to the fact that, under PERL_GLOBAL_STRUCT, "global" vars
are actually allocated, and are freed as the very last thing before
exiting (later than perl_destruct()). In the code above, the created
thread is still exeecuting at this point, and so may access those "global"
vars.  ASan can detect that such a var is being accessed after being
freed; in this case due to PL_ppaddr being indexed in call_sv().

This is easily fixed using the PL_veto_cleanup mechanism; don't do those
final frees if there are still threads running.
util.c