]> git.vpit.fr Git - perl/modules/Thread-Cleanup.git/blobdiff - Cleanup.xs
Update VPIT::TestHelpers to 15e8aee3
[perl/modules/Thread-Cleanup.git] / Cleanup.xs
index c4f802b6a3acdac0f6c6afd1974a8abc42b4ae23..4fd00ecb41ee67c1ddb1da76baa34f595698b6a6 100644 (file)
@@ -1,9 +1,9 @@
 /* This file is part of the Thread::Cleanup Perl module.
  * See http://search.cpan.org/dist/Thread-Cleanup/ */
-   
+
 #define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
-#include "perl.h" 
+#include "perl.h"
 #include "XSUB.h"
 
 #define __PACKAGE__     "Thread::Cleanup"
@@ -11,8 +11,6 @@
 
 #define TC_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S))))))
 
-#include "reap.h"
-
 STATIC void tc_callback(pTHX_ void *ud) {
  dSP;
 
@@ -30,6 +28,29 @@ STATIC void tc_callback(pTHX_ void *ud) {
  LEAVE;
 }
 
+STATIC int tc_endav_free(pTHX_ SV *sv, MAGIC *mg) {
+ SAVEDESTRUCTOR_X(tc_callback, NULL);
+
+ return 0;
+}
+
+STATIC MGVTBL tc_endav_vtbl = {
+ 0,
+ 0,
+ 0,
+ 0,
+ tc_endav_free
+#if MGf_COPY
+ , 0
+#endif
+#if MGf_DUP
+ , 0
+#endif
+#if MGf_LOCAL
+ , 0
+#endif
+};
+
 MODULE = Thread::Cleanup            PACKAGE = Thread::Cleanup
 
 PROTOTYPES: DISABLE
@@ -37,6 +58,16 @@ PROTOTYPES: DISABLE
 void
 CLONE(...)
 PREINIT:
+ GV *gv;
 PPCODE:
- reap(3, tc_callback, NULL);
+ gv = gv_fetchpv(__PACKAGE__ "::_CLEANUP", 0, SVt_PVCV);
+ if (gv) {
+  CV *cv = GvCV(gv);
+  if (!PL_endav)
+   PL_endav = newAV();
+  SvREFCNT_inc(cv);
+  if (!av_store(PL_endav, av_len(PL_endav) + 1, (SV *) cv))
+   SvREFCNT_dec(cv);
+  sv_magicext((SV *) PL_endav, NULL, PERL_MAGIC_ext, &tc_endav_vtbl, NULL, 0);
+ }
  XSRETURN(0);