X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLinux-SysInfo.git;a=blobdiff_plain;f=SysInfo.xs;h=8e4f0dc24542bee2ee4685f51f43802472c12b1e;hp=c2b268d06631a3f4de0c79351a154b5187eb9802;hb=HEAD;hpb=11e5f2a7b384d99ffcc265c3f684983e47d6886c diff --git a/SysInfo.xs b/SysInfo.xs index c2b268d..8e4f0dc 100644 --- a/SysInfo.xs +++ b/SysInfo.xs @@ -10,7 +10,8 @@ #include "perl.h" #include "XSUB.h" -#define __PACKAGE__ "Linux::SysInfo" +#define __PACKAGE__ "Linux::SysInfo" +#define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1) /* --- Extended fields ----------------------------------------------------- */ @@ -23,23 +24,26 @@ /* --- Keys ---------------------------------------------------------------- */ #define LS_KEY(K) (ls_key_##K##_sv) -#if PERL_API_REVISION >= 5 && PERL_API_VERSION >= 9 && PERL_API_SUBVERSION >= 5 -/* From 5.9.5, newSVpvn_share doesn't seem to fill the UV field of the key SV - * properly (the SV actually doesn't even look like a UV). That's why we have - * to keep the hash in another variable. */ +#if PERL_REVISION <= 4 || (PERL_REVISION == 5 && PERL_VERSION <= 6) +/* newSVpvn_share doesn't exist in perl-5.6.x */ # define LS_HASH(K) (ls_key_##K##_hash) -# define LS_KEY_DECLARE(K) STATIC SV *LS_KEY(K) = NULL; \ +# define LS_KEY_DECLARE(K) STATIC const char LS_KEY(K)[] = #K; \ STATIC U32 LS_HASH(K) = 0 -# define LS_KEY_DEFINE(K) PERL_HASH(LS_HASH(K), #K, sizeof(#K)-1); \ - LS_KEY(K) = newSVpvn_share(#K, sizeof(#K)-1, \ - LS_HASH(K)); -# define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), LS_HASH(K)) +# define LS_KEY_DEFINE(K) PERL_HASH(LS_HASH(K), LS_KEY(K), sizeof(#K)-1) +# define LS_KEY_STORE(H,K,V) hv_store((H), LS_KEY(K), sizeof(#K)-1, \ + (V), LS_HASH(K)) #else -/* This won't work for 5.9.3 (5.9.4 ?), neither will the previous one. - * If you want to bleed, upgrade your blead! */ +# if PERL_REVISION > 5 || (PERL_REVISION == 5 && (PERL_VERSION > 9 || (PERL_VERSION == 9 && PERL_SUBVERSION >= 3))) +/* From perl-5.9.3 (#24802), the key is only a SVt_PV and one can get the hash + * value with the SvSHARED_HASH() macro. */ +# define LS_HASH(K) SvSHARED_HASH(LS_KEY(K)) +# else +/* Before, the key was a SVt_PVIV and the hash was stored in the UV field. */ +# define LS_HASH(K) SvUVX(LS_KEY(K)) +# endif # define LS_KEY_DECLARE(K) STATIC SV *LS_KEY(K) = NULL # define LS_KEY_DEFINE(K) LS_KEY(K) = newSVpvn_share(#K, sizeof(#K)-1, 0) -# define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), SvUVX(LS_KEY(K))) +# define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), LS_HASH(K)) #endif LS_KEY_DECLARE(uptime); @@ -68,7 +72,7 @@ PROTOTYPES: ENABLE BOOT: { HV *stash; - stash = gv_stashpv(__PACKAGE__, TRUE); + stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, TRUE); newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(LS_HAS_EXTENDED)); LS_KEY_DEFINE(uptime); @@ -90,40 +94,39 @@ BOOT: } SV *sysinfo() +PROTOTYPE: PREINIT: struct sysinfo si; NV l; - HV *h; + HV *hv; CODE: - if (sysinfo(&si) == -1) { - XSRETURN_UNDEF; - } + if (sysinfo(&si) == -1) XSRETURN_UNDEF; - h = newHV(); + hv = newHV(); - LS_KEY_STORE(h, uptime, newSViv(si.uptime)); + LS_KEY_STORE(hv, uptime, newSViv(si.uptime)); l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT))); - LS_KEY_STORE(h, load1, newSVnv(l)); + LS_KEY_STORE(hv, load1, newSVnv(l)); l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT))); - LS_KEY_STORE(h, load5, newSVnv(l)); + LS_KEY_STORE(hv, load5, newSVnv(l)); l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT))); - LS_KEY_STORE(h, load15, newSVnv(l)); - - LS_KEY_STORE(h, totalram, newSVuv(si.totalram)); - LS_KEY_STORE(h, freeram, newSVuv(si.freeram)); - LS_KEY_STORE(h, sharedram, newSVuv(si.sharedram)); - LS_KEY_STORE(h, bufferram, newSVuv(si.bufferram)); - LS_KEY_STORE(h, totalswap, newSVuv(si.totalswap)); - LS_KEY_STORE(h, freeswap, newSVuv(si.freeswap)); - LS_KEY_STORE(h, procs, newSVuv(si.procs)); + LS_KEY_STORE(hv, load15, newSVnv(l)); + + LS_KEY_STORE(hv, totalram, newSVuv(si.totalram)); + LS_KEY_STORE(hv, freeram, newSVuv(si.freeram)); + LS_KEY_STORE(hv, sharedram, newSVuv(si.sharedram)); + LS_KEY_STORE(hv, bufferram, newSVuv(si.bufferram)); + LS_KEY_STORE(hv, totalswap, newSVuv(si.totalswap)); + LS_KEY_STORE(hv, freeswap, newSVuv(si.freeswap)); + LS_KEY_STORE(hv, procs, newSVuv(si.procs)); #if LS_HAS_EXTENDED - LS_KEY_STORE(h, totalhigh, newSVuv(si.totalhigh)); - LS_KEY_STORE(h, freehigh, newSVuv(si.freehigh)); - LS_KEY_STORE(h, mem_unit, newSVuv(si.mem_unit)); + LS_KEY_STORE(hv, totalhigh, newSVuv(si.totalhigh)); + LS_KEY_STORE(hv, freehigh, newSVuv(si.freehigh)); + LS_KEY_STORE(hv, mem_unit, newSVuv(si.mem_unit)); #endif /* LS_HAS_EXTENDED */ - RETVAL = newRV_noinc((SV *) h); + RETVAL = newRV_noinc((SV *) hv); OUTPUT: RETVAL