File Coverage

File:SysInfo.xs
Coverage:100.0%

linestmtbrancondsubpodtimecode
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#define __PACKAGE_LEN__ (sizeof(__PACKAGE__)-1)
15
16/* --- Extended fields ----------------------------------------------------- */
17
18#if ((defined(__i386__) || defined(__x86_64__)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 23))) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 48))
19# define LS_HAS_EXTENDED 1
20#else
21# define LS_HAS_EXTENDED 0
22#endif
23
24/* --- Keys ---------------------------------------------------------------- */
25
26#define LS_KEY(K) (ls_key_##K##_sv)
27#if PERL_REVISION <= 4 || (PERL_REVISION == 5 && PERL_VERSION <= 6)
28/* newSVpvn_share doesn't exist in perl-5.6.x */
29# define LS_HASH(K) (ls_key_##K##_hash)
30# define LS_KEY_DECLARE(K) STATIC const char LS_KEY(K)[] = #K; \
31                             STATIC U32 LS_HASH(K) = 0
32# define LS_KEY_DEFINE(K) PERL_HASH(LS_HASH(K), LS_KEY(K), sizeof(#K)-1)
33# define LS_KEY_STORE(H,K,V) hv_store((H), LS_KEY(K), sizeof(#K)-1, \
34                                      (V), LS_HASH(K))
35#else
36# if PERL_REVISION > 5 || (PERL_REVISION == 5 && (PERL_VERSION > 9 || (PERL_VERSION == 9 && PERL_SUBVERSION >= 3)))
37/* From perl-5.9.3 (#24802), the key is only a SVt_PV and one can get the hash
38 * value with the SvSHARED_HASH() macro. */
39# define LS_HASH(K) SvSHARED_HASH(LS_KEY(K))
40# else
41/* Before, the key was a SVt_PVIV and the hash was stored in the UV field. */
42# define LS_HASH(K) SvUVX(LS_KEY(K))
43# endif
44# define LS_KEY_DECLARE(K) STATIC SV *LS_KEY(K) = NULL
45# define LS_KEY_DEFINE(K) LS_KEY(K) = newSVpvn_share(#K, sizeof(#K)-1, 0)
46# define LS_KEY_STORE(H,K,V) hv_store_ent((H), LS_KEY(K), (V), LS_HASH(K))
47#endif
48
49LS_KEY_DECLARE(uptime);
50LS_KEY_DECLARE(load1);
51LS_KEY_DECLARE(load5);
52LS_KEY_DECLARE(load15);
53LS_KEY_DECLARE(totalram);
54LS_KEY_DECLARE(freeram);
55LS_KEY_DECLARE(sharedram);
56LS_KEY_DECLARE(bufferram);
57LS_KEY_DECLARE(totalswap);
58LS_KEY_DECLARE(freeswap);
59LS_KEY_DECLARE(procs);
60#if LS_HAS_EXTENDED
61LS_KEY_DECLARE(totalhigh);
62LS_KEY_DECLARE(freehigh);
63LS_KEY_DECLARE(mem_unit);
64#endif /* LS_HAS_EXTENDED */
65
66/* --- XS ------------------------------------------------------------------ */
67
68MODULE = Linux::SysInfo PACKAGE = Linux::SysInfo
69
70PROTOTYPES: ENABLE
71
72BOOT:
73{
74 HV *stash;
75
5
 stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, TRUE);
76
5
 newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(LS_HAS_EXTENDED));
77
78
5
 LS_KEY_DEFINE(uptime);
79
5
 LS_KEY_DEFINE(load1);
80
5
 LS_KEY_DEFINE(load5);
81
5
 LS_KEY_DEFINE(load15);
82
5
 LS_KEY_DEFINE(totalram);
83
5
 LS_KEY_DEFINE(freeram);
84
5
 LS_KEY_DEFINE(sharedram);
85
5
 LS_KEY_DEFINE(bufferram);
86
5
 LS_KEY_DEFINE(totalswap);
87
5
 LS_KEY_DEFINE(freeswap);
88
5
 LS_KEY_DEFINE(procs);
89#if LS_HAS_EXTENDED
90
5
 LS_KEY_DEFINE(totalhigh);
91
5
 LS_KEY_DEFINE(freehigh);
92
5
 LS_KEY_DEFINE(mem_unit);
93#endif /* LS_HAS_EXTENDED */
94}
95
96SV *sysinfo()
97PROTOTYPE:
98PREINIT:
99 struct sysinfo si;
100 NV l;
101 HV *hv;
102CODE:
103
10
 if (sysinfo(&si) == -1) XSRETURN_UNDEF;
104
105
10
 hv = newHV();
106
107
10
 LS_KEY_STORE(hv, uptime, newSViv(si.uptime));
108
109
10
 l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
110
10
 LS_KEY_STORE(hv, load1, newSVnv(l));
111
10
 l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
112
10
 LS_KEY_STORE(hv, load5, newSVnv(l));
113
10
 l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
114
10
 LS_KEY_STORE(hv, load15, newSVnv(l));
115
116
10
 LS_KEY_STORE(hv, totalram, newSVuv(si.totalram));
117
10
 LS_KEY_STORE(hv, freeram, newSVuv(si.freeram));
118
10
 LS_KEY_STORE(hv, sharedram, newSVuv(si.sharedram));
119
10
 LS_KEY_STORE(hv, bufferram, newSVuv(si.bufferram));
120
10
 LS_KEY_STORE(hv, totalswap, newSVuv(si.totalswap));
121
10
 LS_KEY_STORE(hv, freeswap, newSVuv(si.freeswap));
122
10
 LS_KEY_STORE(hv, procs, newSVuv(si.procs));
123#if LS_HAS_EXTENDED
124
10
 LS_KEY_STORE(hv, totalhigh, newSVuv(si.totalhigh));
125
10
 LS_KEY_STORE(hv, freehigh, newSVuv(si.freehigh));
126
10
 LS_KEY_STORE(hv, mem_unit, newSVuv(si.mem_unit));
127#endif /* LS_HAS_EXTENDED */
128
129
10
 RETVAL = newRV_noinc((SV *) hv);
130OUTPUT:
131 RETVAL
132