1 /* This file is part of the Linux::SysInfo Perl module.
2 * See http://search.cpan.org/dist/Linux-SysInfo/
3 * Vincent Pit - 2007 */
5 #include <linux/version.h> /* LINUX_VERSION_CODE, KERNEL_VERSION() */
6 #include <sys/sysinfo.h> /* <struct sysinfo>, sysinfo(), SI_LOAD_SHIFT */
8 #define PERL_NO_GET_CONTEXT
13 #define __PACKAGE__ "Linux::SysInfo"
15 /* --- Extended fields ----------------------------------------------------- */
17 #if ((defined(__i386__) || defined(__x86_64__)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 23))) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 48))
18 # define LS_HAS_EXTENDED 1
20 # define LS_HAS_EXTENDED 0
23 /* --- Keys ---------------------------------------------------------------- */
25 #define LS_KEY(K) (ls_key_##K##_sv)
26 #if PERL_API_REVISION >= 5 && PERL_API_VERSION >= 9 && PERL_API_SUBVERSION >= 5
27 /* From 5.9.5, newSVpvn_share doesn't seem to fill the UV field of the key SV
28 * properly (the SV actually doesn't even look like a UV). That's why we have
29 * to keep the hash in another variable. */
30 # define LS_HASH(K) (ls_key_##K##_hash)
31 # define LS_KEY_DECLARE(K) STATIC SV *LS_KEY(K) = NULL; \
32 STATIC U32 LS_HASH(K) = 0
33 # define LS_KEY_DEFINE(K) PERL_HASH(LS_HASH(K), #K, sizeof(#K)-1); \
34 LS_KEY(K) = newSVpvn_share(#K, sizeof(#K)-1, \
36 # define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), LS_HASH(K))
38 /* This won't work for 5.9.3 (5.9.4 ?), neither will the previous one.
39 * If you want to bleed, upgrade your blead! */
40 # define LS_KEY_DECLARE(K) STATIC SV *LS_KEY(K) = NULL
41 # define LS_KEY_DEFINE(K) LS_KEY(K) = newSVpvn_share(#K, sizeof(#K)-1, 0)
42 # define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), SvUVX(LS_KEY(K)))
45 LS_KEY_DECLARE(uptime);
46 LS_KEY_DECLARE(load1);
47 LS_KEY_DECLARE(load5);
48 LS_KEY_DECLARE(load15);
49 LS_KEY_DECLARE(totalram);
50 LS_KEY_DECLARE(freeram);
51 LS_KEY_DECLARE(sharedram);
52 LS_KEY_DECLARE(bufferram);
53 LS_KEY_DECLARE(totalswap);
54 LS_KEY_DECLARE(freeswap);
55 LS_KEY_DECLARE(procs);
57 LS_KEY_DECLARE(totalhigh);
58 LS_KEY_DECLARE(freehigh);
59 LS_KEY_DECLARE(mem_unit);
60 #endif /* LS_HAS_EXTENDED */
62 /* --- XS ------------------------------------------------------------------ */
64 MODULE = Linux::SysInfo PACKAGE = Linux::SysInfo
71 stash = gv_stashpv(__PACKAGE__, TRUE);
72 newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(LS_HAS_EXTENDED));
74 LS_KEY_DEFINE(uptime);
77 LS_KEY_DEFINE(load15);
78 LS_KEY_DEFINE(totalram);
79 LS_KEY_DEFINE(freeram);
80 LS_KEY_DEFINE(sharedram);
81 LS_KEY_DEFINE(bufferram);
82 LS_KEY_DEFINE(totalswap);
83 LS_KEY_DEFINE(freeswap);
86 LS_KEY_DEFINE(totalhigh);
87 LS_KEY_DEFINE(freehigh);
88 LS_KEY_DEFINE(mem_unit);
89 #endif /* LS_HAS_EXTENDED */
98 if (sysinfo(&si) == -1) {
104 LS_KEY_STORE(h, uptime, newSViv(si.uptime));
106 l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
107 LS_KEY_STORE(h, load1, newSVnv(l));
108 l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
109 LS_KEY_STORE(h, load5, newSVnv(l));
110 l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
111 LS_KEY_STORE(h, load15, newSVnv(l));
113 LS_KEY_STORE(h, totalram, newSVuv(si.totalram));
114 LS_KEY_STORE(h, freeram, newSVuv(si.freeram));
115 LS_KEY_STORE(h, sharedram, newSVuv(si.sharedram));
116 LS_KEY_STORE(h, bufferram, newSVuv(si.bufferram));
117 LS_KEY_STORE(h, totalswap, newSVuv(si.totalswap));
118 LS_KEY_STORE(h, freeswap, newSVuv(si.freeswap));
119 LS_KEY_STORE(h, procs, newSVuv(si.procs));
121 LS_KEY_STORE(h, totalhigh, newSVuv(si.totalhigh));
122 LS_KEY_STORE(h, freehigh, newSVuv(si.freehigh));
123 LS_KEY_STORE(h, mem_unit, newSVuv(si.mem_unit));
124 #endif /* LS_HAS_EXTENDED */
126 RETVAL = newRV_noinc((SV *) h);