void get_proc_mem (dbgov_proc_mem * buf, pid_t pid, pid_t tid) { char buffer[BUFSIZ], *p; const size_t pagesize = get_page_size (); memset (buf, 0, sizeof (dbgov_proc_mem)); int res = try_file_to_buffer (buffer, "/proc/%d/task/%d/stat", pid, tid); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { p = proc_stat_after_cmd (buffer); if (!p) return; p = skip_multiple_token (p, 20); buf->vsize = strtoull (p, &p, 0); buf->rss = strtoull (p, &p, 0); buf->rss_rlim = strtoull (p, &p, 0); int res = try_file_to_buffer(buffer, "/proc/%d/task/%d/statm", pid, tid); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { buf->size = strtoull (buffer, &p, 0); buf->resident = strtoull (p, &p, 0); buf->share = strtoull (p, &p, 0); } buf->size *= pagesize; buf->resident *= pagesize; buf->share *= pagesize; buf->rss *= pagesize; } }
int get_proc_time (dbgov_proc_time * buf, pid_t pid, pid_t tid) { char buffer[BUFSIZ], *p; memset (buf, 0, sizeof (dbgov_proc_time)); int res = try_file_to_buffer (buffer, "/proc/%d/task/%d/stat", pid, tid); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { p = proc_stat_after_cmd (buffer); if (!p) return -1; p = skip_multiple_token (p, 11); buf->utime = strtoull (p, &p, 0); buf->stime = strtoull (p, &p, 0); buf->rtime = buf->utime + buf->stime; buf->cutime = strtoull (p, &p, 0); buf->cstime = strtoull (p, &p, 0); p = skip_multiple_token (p, 3); buf->it_real_value = strtoull (p, &p, 0); buf->frequency = 100; } else { return -2; } return 0; }
void get_cpu (dbgov_cpu * buf) { char buffer[BUFSIZ], *p; memset (buf, 0, sizeof (dbgov_cpu)); int res = try_file_to_buffer (buffer, FILENAME); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { p = skip_token (buffer); buf->user = strtoull (p, &p, 0); buf->nice = strtoull (p, &p, 0); buf->sys = strtoull (p, &p, 0); buf->idle = strtoull (p, &p, 0); buf->total = buf->user + buf->nice + buf->sys + buf->idle; /* 2.6 kernel */ if (os_version_code >= LINUX_VERSION_CODE (2, 6, 0)) { buf->iowait = strtoull (p, &p, 0); buf->irq = strtoull (p, &p, 0); buf->softirq = strtoull (p, &p, 0); buf->total += buf->iowait + buf->irq + buf->softirq; } buf->frequency = 100; } }
void file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filename) { switch(try_file_to_buffer(buffer, bufsiz, "%s", filename)) { case TRY_FILE_TO_BUFFER_OPEN: glibtop_error_io_r (server, "open (%s)", filename); case TRY_FILE_TO_BUFFER_READ: glibtop_error_io_r (server, "read (%s)", filename); } }
void get_mem (dbgov_mem * buf) { char buffer[BUFSIZ]; memset (buf, 0, sizeof *buf); int res = try_file_to_buffer (buffer, FILENAMEMEM); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { buf->total = get_scaled_iostat (buffer, "MemTotal:"); buf->free = get_scaled_iostat (buffer, "MemFree:"); buf->used = buf->total - buf->free; buf->shared = 0; buf->buffer = get_scaled_iostat (buffer, "Buffers:"); buf->cached = get_scaled_iostat (buffer, "Cached:"); buf->user = buf->total - buf->free - buf->cached - buf->buffer; } }
int get_io_stat (dbgov_iostat * info, pid_t pid, pid_t tid) { char buffer[BUFSIZ]; io_stat_reset (info); int res = try_file_to_buffer (buffer, "/proc/%d/task/%d/io", pid, tid); if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT) { info->rchar = get_scaled_iostat (buffer, "rchar:"); info->wchar = get_scaled_iostat (buffer, "wchar:"); info->read_bytes = get_scaled_iostat (buffer, "read_bytes:"); info->write_bytes = get_scaled_iostat (buffer, "write_bytes:"); info->cancelled_write_bytes = get_scaled_iostat (buffer, "cancelled_write_bytes:"); if(info->cancelled_write_bytes<=info->write_bytes){ info->write_bytes = info->write_bytes - info->cancelled_write_bytes; } else { info->write_bytes = 0; } } else { return -2; } return 0; }
static inline int proc_file_to_buffer (char *buffer, size_t bufsiz, const char *fmt, pid_t pid) { return try_file_to_buffer(buffer, bufsiz, fmt, pid); }