nmeter: 4k buffers are too small for /proc files,

make them dynamically sized with 16k upper limit. +75 bytes
This commit is contained in:
Denis Vlasenko 2008-09-26 11:12:09 +00:00
parent ee5dce3365
commit bfc93a3caf

View File

@ -22,11 +22,14 @@
typedef unsigned long long ullong; typedef unsigned long long ullong;
enum { PROC_FILE_SIZE = 4096 }; enum { /* Preferably use powers of 2 */
PROC_MIN_FILE_SIZE = 256,
PROC_MAX_FILE_SIZE = 16 * 1024,
};
typedef struct proc_file { typedef struct proc_file {
char *file; char *file;
//const char *name; int file_sz;
smallint last_gen; smallint last_gen;
} proc_file; } proc_file;
@ -124,30 +127,42 @@ static void put_question_marks(int count)
put_c('?'); put_c('?');
} }
static void readfile_z(char *buf, int sz, const char* fname) static void readfile_z(proc_file *pf, const char* fname)
{ {
// open_read_close() will do two reads in order to be sure we are at EOF, // open_read_close() will do two reads in order to be sure we are at EOF,
// and we don't need/want that. // and we don't need/want that.
// sz = open_read_close(fname, buf, sz-1); int fd;
int sz, rdsz;
char *buf;
int fd = xopen(fname, O_RDONLY); sz = pf->file_sz;
buf = pf->file;
if (!buf) {
buf = xmalloc(PROC_MIN_FILE_SIZE);
sz = PROC_MIN_FILE_SIZE;
}
again:
fd = xopen(fname, O_RDONLY);
buf[0] = '\0'; buf[0] = '\0';
sz = read(fd, buf, sz - 1); rdsz = read(fd, buf, sz-1);
if (sz > 0)
buf[sz] = '\0';
close(fd); close(fd);
if (rdsz > 0) {
if (rdsz == sz-1 && sz < PROC_MAX_FILE_SIZE) {
sz *= 2;
buf = xrealloc(buf, sz);
goto again;
}
buf[rdsz] = '\0';
}
pf->file_sz = sz;
pf->file = buf;
} }
static const char* get_file(proc_file *pf) static const char* get_file(proc_file *pf)
{ {
if (pf->last_gen != gen) { if (pf->last_gen != gen) {
pf->last_gen = gen; pf->last_gen = gen;
// We allocate PROC_FILE_SIZE bytes. This wastes memory, readfile_z(pf, proc_name[pf - &first_proc_file]);
// but allows us to allocate only once (at first sample)
// per proc file, and reuse buffer for each sample
if (!pf->file)
pf->file = xmalloc(PROC_FILE_SIZE);
readfile_z(pf->file, PROC_FILE_SIZE, proc_name[pf - &first_proc_file]);
} }
return pf->file; return pf->file;
} }