From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

/*###################################################################################
#
# Embperl - Copyright (c) 1997-2008 Gerald Richter / ecos gmbh www.ecos.de
# Embperl - Copyright (c) 2008-2015 Gerald Richter
# Embperl - Copyright (c) 2015-2023 actevy.io
#
# You may distribute under the terms of either the GNU General Public
# License or the Artistic License, as specified in the Perl README file.
# For use with Apache httpd and mod_perl, see also Apache copyright.
#
# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
###################################################################################*/
#define ADDINTMG(name) \
if (rc == 0) \
rc = AddMagic (pApp, EMBPERL_##name##_NAME, &EMBPERL2_mvtTab##name) ;
#define ADDOPTMG(name) \
if (rc == 0) \
rc = AddMagic (pApp, "Embperl::"#name, &EMBPERL2_mvtTab##name) ;
#define INTMG_COMP(name,var,used,sub) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
tApp * a ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
a = r -> pApp ; \
if (!a) \
return 0 ; \
\
sv_setiv (pSV, c -> var) ; \
if (c -> bReqRunning) \
used++ ; \
if ((c -> Config.bDebug & dbgTab) && c -> bReqRunning) \
lprintf (a, "[%d]TAB: get %s = %d, Used = %d\n", r -> pThread -> nPid, #name, c -> var, used) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
tApp * a ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
a = r -> pApp ; \
if (!a) \
return 0 ; \
\
c -> var = SvIV (pSV) ; \
if ((c -> Config.bDebug & dbgTab) && c -> bReqRunning) \
lprintf (a, "[%d]TAB: set %s = %d, Used = %d\n", r -> pThread -> nPid, #name, c -> var, used) ; \
sub ; \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define INTMGshort_COMP(name,var) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
\
sv_setiv (pSV, c -> var) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
\
c -> var = SvIV (pSV) ; \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define INTMGcall(name,var,sub) \
\
void EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
sv_setiv (pSV, var) ; \
sub ; \
} \
\
void EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
var = SvIV (pSV) ; \
sub ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define OPTMGRD(name,var) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
\
sv_setiv (pSV, (var & name)?1:0) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define OPTMG(name,var) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
\
sv_setiv (pSV, (var & name)?1:0) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
\
if (SvIV (pSV)) \
var |= name ; \
else \
var &= ~name ; \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define OPTMGRD_COMP(name,var) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
\
sv_setiv (pSV, (c -> var & name)?1:0) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#define OPTMG_COMP(name,var) \
\
int EMBPERL2_mgGet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
\
\
sv_setiv (pSV, (c -> var & name)?1:0) ; \
return 0 ; \
} \
\
int EMBPERL2_mgSet##name (pTHX_ SV * pSV, MAGIC * mg) \
\
{ \
tReq * r = CurrReq ; \
tComponent * c ; \
if (!r) \
return 0 ; \
c = &r -> Component ; \
if (!c) \
return 0 ; \
\
\
if (SvIV (pSV)) \
c -> var |= name ; \
else \
c -> var &= ~name ; \
return 0 ; \
} \
\
MGVTBL EMBPERL2_mvtTab##name = { EMBPERL2_mgGet##name, EMBPERL2_mgSet##name, NULL, NULL, NULL } ;
#ifdef EPDEBUGALL
#define EPENTRY(func) if (r -> bDebug & dbgFunc) { lprintf (r, "[%d]DBG: %dms %s\n", r -> nPid, clock () * 1000 / CLOCKS_PER_SEC, #func) ; FlushLog (r) ; }
#define EPENTRY1N(func,arg1) if (r -> bDebug & dbgFunc) { lprintf (r, "[%d]DBG: %dms %s %d\n", r -> nPid, clock () * 1000 / CLOCKS_PER_SEC, #func, arg1) ; FlushLog (r) ; }
#define EPENTRY1S(func,arg1) if (r -> bDebug & dbgFunc) { lprintf (r, "[%d]DBG: %dms %s %s\n", r -> nPid, clock () * 1000 / CLOCKS_PER_SEC, #func, arg1) ; FlushLog (r) ; }
#else
#define EPENTRY(func)
#define EPENTRY1N(func,arg1)
#define EPENTRY1S(func,arg1)
#endif
#define AssignSVPtr(ppDst,pSrc) { if (*ppDst) SvREFCNT_dec (*ppDst) ; *ppDst = pSrc ; }