void glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid) { char buffer [BUFSIZ], *p; memset (buf, 0, sizeof (glibtop_proc_kernel)); if (proc_stat_to_buffer(buffer, sizeof buffer, pid)) return; p = proc_stat_after_cmd (buffer); if (!p) return; p = skip_multiple_token (p, 6); buf->k_flags = strtoull (p, &p, 0); buf->min_flt = strtoull (p, &p, 0); buf->cmin_flt = strtoull (p, &p, 0); buf->maj_flt = strtoull (p, &p, 0); buf->cmaj_flt = strtoull (p, &p, 0); p = skip_multiple_token (p, 15); buf->kstk_esp = strtoull (p, &p, 0); buf->kstk_eip = strtoull (p, &p, 0); p = skip_multiple_token (p, 4); buf->nwchan = strtoull (p, &p, 0); proc_file_to_buffer(buf->wchan, sizeof buf->wchan, "/proc/%d/wchan", pid), buf->flags = _glibtop_sysdeps_proc_kernel; }
gboolean mono_debugger_libgtop_glue_get_memory (int pid, LibGTopGlueMemoryInfo *info) { char buffer [BUFSIZ], *p; if (proc_stat_to_buffer (buffer, sizeof buffer, pid)) return FALSE; p = proc_stat_after_cmd (buffer); if (!p) return FALSE; p = skip_multiple_token (p, 20); info->vsize = strtoull (p, &p, 0); info->rss = strtoull (p, &p, 0); info->rss_rlim = strtoull (p, &p, 0); if (proc_statm_to_buffer (buffer, sizeof buffer, pid)) return FALSE; info->size = strtoull (buffer, &p, 0); info->resident = strtoull (p, &p, 0); info->share = strtoull (p, &p, 0); return TRUE; }
void glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf, pid_t pid) { char buffer [BUFSIZ], *p; const size_t pagesize = getpagesize(); memset (buf, 0, sizeof (glibtop_proc_segment)); if (proc_stat_to_buffer(buffer, sizeof buffer, pid)) return; p = proc_stat_after_cmd (buffer); if (!p) return; p = skip_multiple_token (p, 23); buf->start_code = strtoull (p, &p, 0); buf->end_code = strtoull (p, &p, 0); buf->start_stack = strtoull (p, &p, 0); buf->flags = _glibtop_sysdeps_proc_segment; if (proc_statm_to_buffer(buffer, sizeof buffer, pid)) return; p = skip_multiple_token (buffer, 3); /* This doesn't work very well due to a bug in the Linux kernel. * I'll submit a patch to the kernel mailing list soon. */ buf->text_rss = strtoull (p, &p, 0); buf->shlib_rss = strtoull (p, &p, 0); buf->data_rss = strtoull (p, &p, 0); buf->dirty_size = strtoull (p, &p, 0); buf->text_rss *= pagesize; buf->shlib_rss *= pagesize; buf->data_rss *= pagesize; buf->dirty_size *= pagesize; buf->flags |= _glibtop_sysdeps_proc_segment_statm; }
void glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid) { char buffer [BUFSIZ], *p; memset (buf, 0, sizeof (glibtop_proc_uid)); if (proc_status_to_buffer(buffer, sizeof buffer, pid)) return; /* Search substring 'Pid:' */ p = strstr (buffer, "\nPid:"); if (!p) return; p = skip_token (p); /* "Pid:" */ buf->pid = strtol (p, &p, 0); p = skip_token (p); /* "PPid:" */ buf->ppid = strtol (p, &p, 0); /* Maybe future Linux versions place something between * "PPid" and "Uid", so we catch this here. */ p = strstr (p, "\nUid:"); if (!p) return; p = skip_token (p); /* "Uid:" */ buf->uid = strtol (p, &p, 0); buf->euid = strtol (p, &p, 0); /* We don't know how many entries on the "Uid:" line * future Linux version will have, so we catch this here. */ p = strstr (p, "\nGid:"); if (!p) return; p = skip_token (p); /* "Gid:" */ buf->gid = strtol (p, &p, 0); buf->egid = strtol (p, &p, 0); buf->flags = _glibtop_sysdeps_proc_uid; if (proc_stat_to_buffer(buffer, sizeof buffer, pid)) return; p = proc_stat_after_cmd (buffer); if (!p) return; p = skip_multiple_token (p, 2); buf->pgrp = strtol (p, &p, 0); buf->session = strtol (p, &p, 0); buf->tty = strtol (p, &p, 0); buf->tpgid = strtol (p, &p, 0); p = skip_multiple_token (p, 9); buf->priority = strtol (p, &p, 0); buf->nice = strtol (p, &p, 0); if (buf->tty == 0) /* the old notty val, update elsewhere bef. moving to 0 */ buf->tty = -1; if (server->os_version_code < LINUX_VERSION_CODE(1,3,39)) { /* map old meanings to new */ buf->priority = 2*15 - buf->priority; buf->nice = 15 - buf->nice; } else if (server->os_version_code < LINUX_VERSION_CODE(1,1,30) && buf->tty != -1) /* when tty wasn't full devno */ buf->tty = 4*0x100 + buf->tty; buf->flags |= _glibtop_sysdeps_proc_uid_stat; }