]> git.vpit.fr Git - perl/modules/Linux-SysInfo.git/blob - SysInfo.xs
Importing Linux-SysInfo-0.05.tar.gz
[perl/modules/Linux-SysInfo.git] / SysInfo.xs
1 /* This file is part of the Linux::SysInfo Perl module.
2  * See http://search.cpan.org/dist/Linux-SysInfo/
3  * Vincent Pit - 2007 */
4
5 #include <linux/version.h> /* LINUX_VERSION_CODE, KERNEL_VERSION() */
6 #include <sys/sysinfo.h>   /* <struct sysinfo>, sysinfo(), SI_LOAD_SHIFT */
7
8 #define PERL_NO_GET_CONTEXT
9 #include "EXTERN.h"
10 #include "perl.h"
11 #include "XSUB.h"
12
13 #define __PACKAGE__ "Linux::SysInfo"
14
15 /* --- Extended fields ----------------------------------------------------- */
16
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
19 #else
20 # define LS_HAS_EXTENDED 0
21 #endif
22
23 /* --- Keys ---------------------------------------------------------------- */
24
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, \
35                                                         LS_HASH(K));
36 # define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), LS_HASH(K))
37 #else
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)))
43 #endif
44
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);
56 #if LS_HAS_EXTENDED
57 LS_KEY_DECLARE(totalhigh);
58 LS_KEY_DECLARE(freehigh);
59 LS_KEY_DECLARE(mem_unit);
60 #endif /* LS_HAS_EXTENDED */
61
62 /* --- XS ------------------------------------------------------------------ */
63
64 MODULE = Linux::SysInfo              PACKAGE = Linux::SysInfo
65
66 PROTOTYPES: ENABLE
67
68 BOOT:
69 {
70  HV *stash;
71  stash = gv_stashpv(__PACKAGE__, TRUE);
72  newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(LS_HAS_EXTENDED));
73
74  LS_KEY_DEFINE(uptime);
75  LS_KEY_DEFINE(load1);
76  LS_KEY_DEFINE(load5);
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);
84  LS_KEY_DEFINE(procs);
85 #if LS_HAS_EXTENDED
86  LS_KEY_DEFINE(totalhigh);
87  LS_KEY_DEFINE(freehigh);
88  LS_KEY_DEFINE(mem_unit);
89 #endif /* LS_HAS_EXTENDED */
90 }
91
92 SV *sysinfo()
93 PREINIT:
94  struct sysinfo si;
95  NV l;
96  HV *h;
97 CODE:
98  if (sysinfo(&si) == -1) {
99   XSRETURN_UNDEF;
100  }
101
102  h = newHV();
103
104  LS_KEY_STORE(h, uptime,    newSViv(si.uptime));
105
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));
112
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));
120 #if LS_HAS_EXTENDED
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 */
125
126  RETVAL = newRV_noinc((SV *) h);
127 OUTPUT:
128  RETVAL
129