From: Filipp Gunbin <fgunbin@fastmail.fm>
To: 48548@debbugs.gnu.org
Subject: bug#48548: 28.0.50; Some process attributes on macOS are missing
Date: Thu, 20 May 2021 23:39:34 +0300 [thread overview]
Message-ID: <m2v97d5ed5.fsf@fastmail.fm> (raw)
In-Reply-To: <m28s496t4j.fsf@fastmail.fm> (Filipp Gunbin's message of "Thu, 20 May 2021 23:35:24 +0300")
Improve system_process_attributes on macOS (Bug#48548)
* src/sysdep.c (system_process_attributes): Fix misprint in 'tty' attr
- should be 'ttname' instead. Change 'utime', 'stime', 'time',
'majflt' attrs to obtain them from proc_pid_rusage, as sysctl call
used before doesn't give correct values; remove 'minflt' because it's
not available. Obtain 'vsize' / 'rss' / 'thcount' from proc_pidinfo.
Use sysctl with KERN_PROCARGS2 to obtain args: value contains both
argc and argv, so argv can be reliably cut out.
diff --git a/src/sysdep.c b/src/sysdep.c
index d940acc4e0..f899bb7532 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -3898,20 +3898,19 @@ system_process_attributes (Lisp_Object pid)
Lisp_Object
system_process_attributes (Lisp_Object pid)
{
- int proc_id;
+ int proc_id, i;
struct passwd *pw;
struct group *gr;
char *ttyname;
struct timeval starttime;
struct timespec t, now;
- struct rusage *rusage;
dev_t tdev;
uid_t uid;
gid_t gid;
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID};
struct kinfo_proc proc;
- size_t proclen = sizeof proc;
+ size_t len = sizeof proc;
Lisp_Object attrs = Qnil;
Lisp_Object decoded_comm;
@@ -3920,7 +3919,7 @@ system_process_attributes (Lisp_Object pid)
CONS_TO_INTEGER (pid, int, proc_id);
mib[3] = proc_id;
- if (sysctl (mib, 4, &proc, &proclen, NULL, 0) != 0 || proclen == 0)
+ if (sysctl (mib, 4, &proc, &len, NULL, 0) != 0 || len == 0)
return attrs;
uid = proc.kp_eproc.e_ucred.cr_uid;
@@ -3957,8 +3956,8 @@ system_process_attributes (Lisp_Object pid)
decoded_comm = (code_convert_string_norecord
(build_unibyte_string (comm),
Vlocale_coding_system, 0));
-
attrs = Fcons (Fcons (Qcomm, decoded_comm), attrs);
+
{
char state[2] = {'\0', '\0'};
switch (proc.kp_proc.p_stat)
@@ -3994,27 +3993,24 @@ system_process_attributes (Lisp_Object pid)
ttyname = tdev == NODEV ? NULL : devname (tdev, S_IFCHR);
unblock_input ();
if (ttyname)
- attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs);
+ attrs = Fcons (Fcons (Qttname, build_string (ttyname)), attrs);
attrs = Fcons (Fcons (Qtpgid, INT_TO_INTEGER (proc.kp_eproc.e_tpgid)),
attrs);
- rusage = proc.kp_proc.p_ru;
- if (rusage)
+ rusage_info_current ri;
+ if (proc_pid_rusage(proc_id, RUSAGE_INFO_CURRENT, (rusage_info_t *) &ri) == 0)
{
- attrs = Fcons (Fcons (Qminflt, INT_TO_INTEGER (rusage->ru_minflt)),
- attrs);
- attrs = Fcons (Fcons (Qmajflt, INT_TO_INTEGER (rusage->ru_majflt)),
- attrs);
-
- attrs = Fcons (Fcons (Qutime, make_lisp_timeval (rusage->ru_utime)),
- attrs);
- attrs = Fcons (Fcons (Qstime, make_lisp_timeval (rusage->ru_stime)),
- attrs);
- t = timespec_add (timeval_to_timespec (rusage->ru_utime),
- timeval_to_timespec (rusage->ru_stime));
- attrs = Fcons (Fcons (Qtime, make_lisp_time (t)), attrs);
- }
+ struct timespec utime = make_timespec (ri.ri_user_time / TIMESPEC_HZ,
+ ri.ri_user_time % TIMESPEC_HZ);
+ struct timespec stime = make_timespec (ri.ri_system_time / TIMESPEC_HZ,
+ ri.ri_system_time % TIMESPEC_HZ);
+ attrs = Fcons (Fcons (Qutime, make_lisp_time (utime)), attrs);
+ attrs = Fcons (Fcons (Qstime, make_lisp_time (stime)), attrs);
+ attrs = Fcons (Fcons (Qtime, make_lisp_time (timespec_add (utime, stime))), attrs);
+
+ attrs = Fcons (Fcons (Qmajflt, INT_TO_INTEGER (ri.ri_pageins)), attrs);
+ }
starttime = proc.kp_proc.p_starttime;
attrs = Fcons (Fcons (Qnice, make_fixnum (proc.kp_proc.p_nice)), attrs);
@@ -4024,6 +4020,50 @@ system_process_attributes (Lisp_Object pid)
t = timespec_sub (now, timeval_to_timespec (starttime));
attrs = Fcons (Fcons (Qetime, make_lisp_time (t)), attrs);
+ struct proc_taskinfo taskinfo;
+ if (proc_pidinfo (proc_id, PROC_PIDTASKINFO, 0, &taskinfo, sizeof (taskinfo)) > 0)
+ {
+ attrs = Fcons (Fcons (Qvsize, make_fixnum (taskinfo.pti_virtual_size / 1024)), attrs);
+ attrs = Fcons (Fcons (Qrss, make_fixnum (taskinfo.pti_resident_size / 1024)), attrs);
+ attrs = Fcons (Fcons (Qthcount, make_fixnum (taskinfo.pti_threadnum)), attrs);
+ }
+
+#ifdef KERN_PROCARGS2
+ char args[ARG_MAX];
+ mib[1] = KERN_PROCARGS2;
+ mib[2] = proc_id;
+ len = sizeof args;
+
+ if (sysctl (mib, 3, &args, &len, NULL, 0) == 0 && len != 0)
+ {
+ char *start, *end;
+
+ int argc = *(int*)args; /* argc is the first int */
+ start = args + sizeof (int);
+
+ start += strlen (start) + 1; /* skip executable name and any '\0's */
+ while ((start - args < len) && ! *start) start++;
+
+ /* skip argv to find real end */
+ for (i = 0, end = start; i < argc && (end - args) < len; i++)
+ {
+ end += strlen (end) + 1;
+ }
+
+ len = end - start;
+ for (int i = 0; i < len; i++)
+ {
+ if (! start[i] && i < len - 1)
+ start[i] = ' ';
+ }
+
+ AUTO_STRING (comm, start);
+ decoded_comm = code_convert_string_norecord (comm,
+ Vlocale_coding_system, 0);
+ attrs = Fcons (Fcons (Qargs, decoded_comm), attrs);
+ }
+#endif /* KERN_PROCARGS2 */
+
return attrs;
}
next prev parent reply other threads:[~2021-05-20 20:39 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-20 20:24 bug#48548: 28.0.50; Some process attributes on macOS are missing Filipp Gunbin
2021-05-20 20:35 ` Filipp Gunbin
2021-05-20 20:39 ` Filipp Gunbin [this message]
2021-05-20 20:49 ` Filipp Gunbin
2021-05-21 5:53 ` Eli Zaretskii
2021-05-21 9:50 ` Filipp Gunbin
2021-05-21 10:27 ` Eli Zaretskii
2021-05-21 12:30 ` Filipp Gunbin
2021-05-21 12:33 ` Eli Zaretskii
2021-05-21 12:36 ` Filipp Gunbin
2021-05-21 12:45 ` Eli Zaretskii
2021-05-21 12:47 ` Eli Zaretskii
2021-05-21 14:49 ` Basil L. Contovounesios
2021-05-21 12:47 ` Filipp Gunbin
2021-05-25 4:08 ` Lars Ingebrigtsen
2021-05-25 17:13 ` Filipp Gunbin
2021-05-25 19:32 ` Lars Ingebrigtsen
2021-05-26 6:52 ` Alan Third
2021-05-26 14:12 ` Filipp Gunbin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2v97d5ed5.fsf@fastmail.fm \
--to=fgunbin@fastmail.fm \
--cc=48548@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.