X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FThread-Cleanup.git;a=blobdiff_plain;f=Cleanup.xs;h=919bbff306c4be383e828301f972c66ff2617572;hp=e88916c2c52be88447a381a336270125ec0e5668;hb=edfeeb476d5446fc117243df3a5b4ce6baa82b43;hpb=5df33e24c91c6ebd942de8ed5eb45dd4c1b24269 diff --git a/Cleanup.xs b/Cleanup.xs index e88916c..919bbff 100644 --- a/Cleanup.xs +++ b/Cleanup.xs @@ -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,17 @@ 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(); + av_unshift(PL_endav, 1); + SvREFCNT_inc(cv); + if (!av_store(PL_endav, 0, cv)) + SvREFCNT_dec(cv); + sv_magicext((SV *) PL_endav, NULL, PERL_MAGIC_ext, &tc_endav_vtbl, NULL, 0); + } XSRETURN(0);