24#ifndef CASA_HOSTINFOSOLARIS_H
25#define CASA_HOSTINFOSOLARIS_H
27#if defined(HOSTINFO_DO_IMPLEMENT)
51#include <sys/sysinfo.h>
84#ifndef KSTAT_DATA_UINT32
95#define pagetok(size) ((*p_pagetok)(size))
98static void get_swapinfo(
int *total,
int *fr);
101class HostMachineInfo {
102 friend class HostInfo;
109 static int pageshift;
110 int (*p_pagetok)(int);
112 static inline int pagetok_none(
int size) {
return (size); }
113 static inline int pagetok_left(
int size) {
return (size << pageshift); }
114 static inline int pagetok_right(
int size) {
return (size >> pageshift); }
121 ptrdiff_t memory_total;
122 ptrdiff_t memory_used;
123 ptrdiff_t memory_free;
125 ptrdiff_t swap_total;
132int HostMachineInfo::pageshift = 0;
134HostMachineInfo::~HostMachineInfo() {
135 if (kc) kstat_close(kc);
138HostMachineInfo::HostMachineInfo() : valid(1), kc(NULL) {
142 i = sysconf(_SC_PAGESIZE);
144 while ((i >>= 1) > 0) pageshift++;
154 p_pagetok = pagetok_left;
155 }
else if (pageshift == 0) {
156 p_pagetok = pagetok_none;
158 p_pagetok = pagetok_right;
159 pageshift = -pageshift;
162 long maxmem = sysconf(_SC_PHYS_PAGES);
163 memory_total = pagetok(maxmem);
168 kstat_t *ks = kstat_lookup(kc,
"unix", 0,
"system_misc");
169 if (kstat_read(kc, ks, 0) == -1) {
170 perror(
"kstat_read");
173 kstat_named_t *kn = (kstat_named_t *)kstat_data_lookup(ks,
"ncpus");
174 cpus = kn->value.ui32;
177void HostMachineInfo::kupdate() {
180 static kid_t kcid = 0;
189 perror(
"kstat_open ");
192 kcid = kc->kc_chain_id;
201 nkcid = kstat_chain_update(kc);
207 perror(
"kstat_read ");
210 if (nkcid != 0)
goto kcid_changed;
213void HostMachineInfo::update_info() {
215 static int swaptotal;
220 ks = kstat_lookup(kc,
"unix", 0,
"system_pages");
221 if (kstat_read(kc, ks, 0) == -1) {
222 perror(
"kstat_read");
225 kn = (kstat_named_t *)kstat_data_lookup(ks,
"freemem");
226 if (kn) freemem = kn->value.ul;
228 memory_free = pagetok(freemem);
229 memory_used = memory_total - memory_free;
231 get_swapinfo(&swaptotal, &swapfree);
232 swap_total = pagetok(swaptotal);
233 swap_used = pagetok(swaptotal - swapfree);
234 swap_free = pagetok(swapfree);
238void get_swapinfo(
int *total,
int *fr)
242 struct anoninfo anon;
244 if (swapctl(SC_AINFO, &anon) == -1) {
248 *total = anon.ani_max;
249 *fr = anon.ani_max - anon.ani_resv;
253 struct swaptable *swt;
255 static char path[256];
258 cnt = swapctl(SC_GETNSWP, 0);
261 swt = (
struct swaptable *)malloc(
sizeof(
int) + cnt *
sizeof(
struct swapent));
271 ste = &(swt->swt_ent[0]);
274 ste++->ste_path = path;
278 swapctl(SC_LIST, swt);
282 ste = &(swt->swt_ent[0]);
286 if (!(ste->ste_flags & ST_INDEL) && !(ste->ste_flags & ST_DOINGDEL)) {
For temporary backward namespace compatibility, use casa as alias for casacore.