5 #include <linux/version.h> /* LINUX_VERSION_CODE, KERNEL_VERSION() */
6 #include <sys/sysinfo.h> /* <struct sysinfo>, sysinfo(), SI_LOAD_SHIFT */
8 #if ((defined(__i386__) || defined(__x86_64__)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 23))) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 3, 48))
9 # define SYSINFO_EXTENDED 1
11 # define SYSINFO_EXTENDED 0
20 #define SYSINFO_KEY_SET_HASH(S) PERL_HASH((S).hash, (S).key, (S).klen)
21 #define SYSINFO_KEY_STORE(H,S,V) hv_store((H), (S).key, (S).klen, (V), (S).hash)
23 static sysinfo_key key_uptime = { "uptime", 6, 0 };
24 static sysinfo_key key_load1 = { "load1", 5, 0 };
25 static sysinfo_key key_load5 = { "load5", 5, 0 };
26 static sysinfo_key key_load15 = { "load15", 6, 0 };
27 static sysinfo_key key_totalram = { "totalram", 8, 0 };
28 static sysinfo_key key_freeram = { "freeram", 7, 0 };
29 static sysinfo_key key_sharedram = { "sharedram", 9, 0 };
30 static sysinfo_key key_bufferram = { "bufferram", 9, 0 };
31 static sysinfo_key key_totalswap = { "totalswap", 9, 0 };
32 static sysinfo_key key_freeswap = { "freeswap", 8, 0 };
33 static sysinfo_key key_procs = { "procs", 5, 0 };
35 static sysinfo_key key_totalhigh = { "totalhigh", 9, 0 };
36 static sysinfo_key key_freehigh = { "freehigh", 8, 0 };
37 static sysinfo_key key_mem_unit = { "mem_unit", 8, 0 };
38 #endif /* SYSINFO_EXTENDED */
40 MODULE = Linux::SysInfo PACKAGE = Linux::SysInfo
47 stash = gv_stashpv("Linux::SysInfo", TRUE);
48 newCONSTSUB(stash, "LS_HAS_EXTENDED", newSViv(SYSINFO_EXTENDED));
50 SYSINFO_KEY_SET_HASH(key_uptime);
51 SYSINFO_KEY_SET_HASH(key_load1);
52 SYSINFO_KEY_SET_HASH(key_load5);
53 SYSINFO_KEY_SET_HASH(key_load15);
54 SYSINFO_KEY_SET_HASH(key_totalram);
55 SYSINFO_KEY_SET_HASH(key_freeram);
56 SYSINFO_KEY_SET_HASH(key_sharedram);
57 SYSINFO_KEY_SET_HASH(key_bufferram);
58 SYSINFO_KEY_SET_HASH(key_totalswap);
59 SYSINFO_KEY_SET_HASH(key_freeswap);
60 SYSINFO_KEY_SET_HASH(key_procs);
62 SYSINFO_KEY_SET_HASH(key_totalhigh);
63 SYSINFO_KEY_SET_HASH(key_freehigh);
64 SYSINFO_KEY_SET_HASH(key_mem_unit);
65 #endif /* SYSINFO_EXTENDED */
75 if (sysinfo(&si) == -1) {
79 h = newHV(); /* mortalized in RETVAL */
81 SYSINFO_KEY_STORE(h, key_uptime, newSViv(si.uptime));
83 l = ((NV) si.loads[0]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
84 SYSINFO_KEY_STORE(h, key_load1, newSVnv(l));
85 l = ((NV) si.loads[1]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
86 SYSINFO_KEY_STORE(h, key_load5, newSVnv(l));
87 l = ((NV) si.loads[2]) / ((NV) (((U32) 1) << ((U32) SI_LOAD_SHIFT)));
88 SYSINFO_KEY_STORE(h, key_load15, newSVnv(l));
90 SYSINFO_KEY_STORE(h, key_totalram, newSVuv(si.totalram));
91 SYSINFO_KEY_STORE(h, key_freeram, newSVuv(si.freeram));
92 SYSINFO_KEY_STORE(h, key_sharedram, newSVuv(si.sharedram));
93 SYSINFO_KEY_STORE(h, key_bufferram, newSVuv(si.bufferram));
94 SYSINFO_KEY_STORE(h, key_totalswap, newSVuv(si.totalswap));
95 SYSINFO_KEY_STORE(h, key_freeswap, newSVuv(si.freeswap));
96 SYSINFO_KEY_STORE(h, key_procs, newSVuv(si.procs));
98 SYSINFO_KEY_STORE(h, key_totalhigh, newSVuv(si.totalhigh));
99 SYSINFO_KEY_STORE(h, key_freehigh, newSVuv(si.freehigh));
100 SYSINFO_KEY_STORE(h, key_mem_unit, newSVuv(si.mem_unit));
101 #endif /* SYSINFO_EXTENDED */
103 RETVAL = newRV_noinc((SV *) h);