wmhdplop: fix integer overflow
After a while, the procstats fields will overflow the signed int field and the hd leds will be permanently on. Use long instead of int for these counters Gentoo original bug: https://bugs.gentoo.org/show_bug.cgi?id=325615
This commit is contained in:
parent
24b831f9b9
commit
13cc7b59b5
|
@ -9,7 +9,7 @@ typedef struct DiskList {
|
||||||
unsigned major, minor;
|
unsigned major, minor;
|
||||||
int hd_id, part_id; /* part_id = 0 for disks */
|
int hd_id, part_id; /* part_id = 0 for disks */
|
||||||
int enable_hddtemp;
|
int enable_hddtemp;
|
||||||
int nr, nw, touched_r, touched_w;
|
long nr, nw, touched_r, touched_w;
|
||||||
struct DiskList *next;
|
struct DiskList *next;
|
||||||
} DiskList;
|
} DiskList;
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
static ProcStats ps;
|
static ProcStats ps;
|
||||||
int use_proc_diskstats;
|
int use_proc_diskstats;
|
||||||
|
|
||||||
void pstat_init(struct pstat *pst, int nslice, float update_interval) {
|
void pstat_init(struct pstat *pst, long nslice, float update_interval) {
|
||||||
pst->nslice = nslice;
|
pst->nslice = nslice;
|
||||||
ALLOC_VEC(pst->slices, nslice);
|
ALLOC_VEC(pst->slices, nslice);
|
||||||
pst->cur_slice = 0;
|
pst->cur_slice = 0;
|
||||||
|
@ -17,7 +17,7 @@ void pstat_init(struct pstat *pst, int nslice, float update_interval) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float pstat_current(struct pstat *pst) {
|
float pstat_current(struct pstat *pst) {
|
||||||
int idx = pst->cur_slice ? pst->cur_slice-1 : pst->nslice-1;
|
long idx = pst->cur_slice ? pst->cur_slice-1 : pst->nslice-1;
|
||||||
return pst->slices[idx]/pst->update_interval;
|
return pst->slices[idx]/pst->update_interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,13 +100,13 @@ void update_stats() {
|
||||||
if (!Prefs.debug_disk_rd) {
|
if (!Prefs.debug_disk_rd) {
|
||||||
pstat_add(&ps.disk_read, nr);
|
pstat_add(&ps.disk_read, nr);
|
||||||
} else {
|
} else {
|
||||||
static int cntr = 0; cntr+=(rand()%30) == 0 ? Prefs.debug_disk_rd : 0;
|
static long cntr = 0; cntr+=(rand()%30) == 0 ? Prefs.debug_disk_rd : 0;
|
||||||
pstat_add(&ps.disk_read, nr + cntr);
|
pstat_add(&ps.disk_read, nr + cntr);
|
||||||
}
|
}
|
||||||
if (!Prefs.debug_disk_wr) {
|
if (!Prefs.debug_disk_wr) {
|
||||||
pstat_add(&ps.disk_write, nw);
|
pstat_add(&ps.disk_write, nw);
|
||||||
} else {
|
} else {
|
||||||
static int cntw = 0; cntw+=(rand()%30) == 0 ? Prefs.debug_disk_wr : 0;
|
static long cntw = 0; cntw+=(rand()%30) == 0 ? Prefs.debug_disk_wr : 0;
|
||||||
pstat_add(&ps.disk_write, nw + cntw);
|
pstat_add(&ps.disk_write, nw + cntw);
|
||||||
}
|
}
|
||||||
readok = 2;
|
readok = 2;
|
||||||
|
@ -120,7 +120,7 @@ void update_stats() {
|
||||||
pstat_add(&ps.swap_in, nr);
|
pstat_add(&ps.swap_in, nr);
|
||||||
pstat_add(&ps.swap_out, nw);
|
pstat_add(&ps.swap_out, nw);
|
||||||
} else {
|
} else {
|
||||||
static int cnt = 0; cnt+=Prefs.debug_swapio;
|
static long cnt = 0; cnt+=Prefs.debug_swapio;
|
||||||
pstat_add(&ps.swap_in, nr + cnt);
|
pstat_add(&ps.swap_in, nr + cnt);
|
||||||
pstat_add(&ps.swap_out, nw + cnt);
|
pstat_add(&ps.swap_out, nw + cnt);
|
||||||
}
|
}
|
||||||
|
@ -143,10 +143,10 @@ void init_stats(float update_interval) {
|
||||||
char s[512];
|
char s[512];
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
pstat_init(&ps.swap_in, (int)(0.5/update_interval)+1, update_interval);
|
pstat_init(&ps.swap_in, (long)(0.5/update_interval)+1, update_interval);
|
||||||
pstat_init(&ps.swap_out, (int)(0.5/update_interval)+1, update_interval);
|
pstat_init(&ps.swap_out, (long)(0.5/update_interval)+1, update_interval);
|
||||||
pstat_init(&ps.disk_read, (int)(0.5/update_interval)+1, update_interval);
|
pstat_init(&ps.disk_read, (long)(0.5/update_interval)+1, update_interval);
|
||||||
pstat_init(&ps.disk_write, (int)(0.5/update_interval)+1, update_interval);
|
pstat_init(&ps.disk_write, (long)(0.5/update_interval)+1, update_interval);
|
||||||
f = fopen("/proc/swaps","r");
|
f = fopen("/proc/swaps","r");
|
||||||
//if (!f) { perror("/proc/swaps"); exit(1); }
|
//if (!f) { perror("/proc/swaps"); exit(1); }
|
||||||
if (f) {
|
if (f) {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
struct pstat {
|
struct pstat {
|
||||||
unsigned long total;
|
unsigned long total;
|
||||||
int nslice, cur_slice;
|
long nslice, cur_slice;
|
||||||
unsigned long *slices;
|
unsigned long *slices;
|
||||||
float update_interval;
|
float update_interval;
|
||||||
};
|
};
|
||||||
|
@ -15,7 +15,7 @@ typedef struct {
|
||||||
struct pstat disk_read, disk_write;
|
struct pstat disk_read, disk_write;
|
||||||
} ProcStats;
|
} ProcStats;
|
||||||
|
|
||||||
void pstat_init(struct pstat *pst, int nslice, float update_interval);
|
void pstat_init(struct pstat *pst, long nslice, float update_interval);
|
||||||
float pstat_current(struct pstat *pst);
|
float pstat_current(struct pstat *pst);
|
||||||
void pstat_add(struct pstat *pst, unsigned long v);
|
void pstat_add(struct pstat *pst, unsigned long v);
|
||||||
void pstat_advance(struct pstat *pst);
|
void pstat_advance(struct pstat *pst);
|
||||||
|
|
Loading…
Reference in a new issue