diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-10-08 14:00:43 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-10-08 16:58:10 +0100 |
commit | 0e7bfc0a13342232c7329dcc019fa6e7fe360521 (patch) | |
tree | aadf0bd025958fe3fa376ed3878df779cc400feb /dist/threads-shared/shared.xs | |
parent | 5de8bffdbc0d73b6750568e36033f7168cd88f51 (diff) | |
download | perl-0e7bfc0a13342232c7329dcc019fa6e7fe360521.tar.gz |
threads::shared should not FREETMPS in its BOOT code.
perl_construct() sets the current interpreter context, and ends in an ENTER.
Hence threads::shared needs to restore the interpreter context, and balance the
ENTER with a leave. Previously it was using its PERL_SET_CONTEXT() macro,
which also contains a FREETMPS. However, this FREETMPS is erroneous in this
specific context, as it does not have a balancing SAVETMPS. Hence calling
SAVETMPS here would run it in the context of the shared interpreter, but it
would (attempt to) free up temporaries created in the context of the parent
interpreter.
Diffstat (limited to 'dist/threads-shared/shared.xs')
-rw-r--r-- | dist/threads-shared/shared.xs | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/dist/threads-shared/shared.xs b/dist/threads-shared/shared.xs index 549fe374b8..6ead3bae43 100644 --- a/dist/threads-shared/shared.xs +++ b/dist/threads-shared/shared.xs @@ -1194,7 +1194,8 @@ Perl_sharedsv_init(pTHX) /* This pair leaves us in shared context ... */ PL_sharedsv_space = perl_alloc(); perl_construct(PL_sharedsv_space); - CALLER_CONTEXT; + LEAVE; /* This balances the ENTER at the end of perl_construct. */ + PERL_SET_CONTEXT((aTHX = caller_perl)); recursive_lock_init(aTHX_ &PL_sharedsv_lock); PL_lockhook = &Perl_sharedsv_locksv; PL_sharehook = &Perl_sharedsv_share; |