]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - Upper.xs
Introduce SU_THREADSAFE
[perl/modules/Scope-Upper.git] / Upper.xs
index 2ebee08b0c1d9b189d3c47ddf26596230ca83dc9..95a22ed74520b2f521fc871b075b60b7ba4489e5 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -278,7 +278,9 @@ typedef struct {
 STATIC void su_call(pTHX_ void *ud_) {
  su_ud_reap *ud = (su_ud_reap *) ud_;
 #if SU_HAS_PERL(5, 10, 0)
+ PERL_CONTEXT saved_cx;
  I32 dieing = PL_op->op_type == OP_DIE;
+ I32 cxix;
 #endif
 
  dSP;
@@ -297,20 +299,20 @@ STATIC void su_call(pTHX_ void *ud_) {
 #if SU_HAS_PERL(5, 10, 0)
  if (dieing) {
   if (cxstack_ix < cxstack_max)
-   ++cxstack_ix;
+   cxix = cxstack_ix + 1;
   else
-   cxstack_ix = Perl_cxinc(aTHX);
+   cxix = Perl_cxinc(aTHX);
+  saved_cx = cxstack[cxix];
  }
 #endif
 
  call_sv(ud->cb, G_VOID);
 
 #if SU_HAS_PERL(5, 10, 0)
- if (dieing && cxstack_ix > 0)
-  --cxstack_ix;
+ if (dieing)
+  cxstack[cxix] = saved_cx;
 #endif
 
- SPAGAIN;
  PUTBACK;
 
  FREETMPS;
@@ -718,7 +720,8 @@ BOOT:
  HV *stash;
  MY_CXT_INIT;
  stash = gv_stashpv(__PACKAGE__, 1);
- newCONSTSUB(stash, "TOP", newSViv(0));
+ newCONSTSUB(stash, "TOP",           newSViv(0));
+ newCONSTSUB(stash, "SU_THREADSAFE", newSVuv(SU_THREADSAFE));
  newXSproto("Scope::Upper::unwind", XS_Scope__Upper_unwind, file, NULL);
 }
 
@@ -729,7 +732,9 @@ CLONE(...)
 PROTOTYPE: DISABLE
 CODE:
  PERL_UNUSED_VAR(items);
- MY_CXT_CLONE;
+ {
+  MY_CXT_CLONE;
+ }
 
 #endif /* SU_THREADSAFE */