From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dan Nicolaescu Newsgroups: gmane.emacs.devel Subject: Re: [patch] FreeBSD support for system processes Date: Thu, 17 Dec 2009 09:26:26 -0800 (PST) Message-ID: <200912171726.nBHHQQQb002971@godzilla.ics.uci.edu> References: <86skbdqvt3.fsf@nirvana.pusto.de> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1261071372 27836 80.91.229.12 (17 Dec 2009 17:36:12 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 17 Dec 2009 17:36:12 +0000 (UTC) Cc: emacs-devel@gnu.org To: Eduard Wiebe Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Dec 17 18:36:05 2009 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1NLKGd-0003gH-Lg for ged-emacs-devel@m.gmane.org; Thu, 17 Dec 2009 18:36:00 +0100 Original-Received: from localhost ([127.0.0.1]:45426 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLKGd-0000Xa-HN for ged-emacs-devel@m.gmane.org; Thu, 17 Dec 2009 12:35:59 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLK9a-00021B-QB for emacs-devel@gnu.org; Thu, 17 Dec 2009 12:28:42 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLK9W-0001v2-Hf for emacs-devel@gnu.org; Thu, 17 Dec 2009 12:28:42 -0500 Original-Received: from [199.232.76.173] (port=51244 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLK9W-0001up-Cx for emacs-devel@gnu.org; Thu, 17 Dec 2009 12:28:38 -0500 Original-Received: from paul-mcgann-v0.ics.uci.edu ([128.195.1.147]:55096) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NLK9V-0005HJ-Jv for emacs-devel@gnu.org; Thu, 17 Dec 2009 12:28:38 -0500 Original-Received: from godzilla.ics.uci.edu (godzilla.ics.uci.edu [128.195.10.101]) by paul-mcgann-v0.ics.uci.edu (8.13.8/8.13.8) with ESMTP id nBHHQR0K006378 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 17 Dec 2009 09:26:27 -0800 Original-Received: (from dann@localhost) by godzilla.ics.uci.edu (8.13.8+Sun/8.13.6/Submit) id nBHHQQQb002971; Thu, 17 Dec 2009 09:26:26 -0800 (PST) In-Reply-To: <86skbdqvt3.fsf@nirvana.pusto.de> (Eduard Wiebe's message of "Mon, 14 Dec 2009 19:01:28 +0100") Original-Lines: 258 X-ICS-MailScanner-Information: Please send mail to helpdesk@ics.uci.edu or more information X-ICS-MailScanner-ID: nBHHQR0K006378 X-ICS-MailScanner: Found to be clean X-ICS-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=2.367, required 5, autolearn=disabled, ALL_TRUSTED -1.44, FF_IHOPE_YOU_SINK 1.70, FM_MULTI_ODD2 1.10, FM_MULTI_ODD3 0.70, TW_GC 0.08, TW_PW 0.08, TW_TP 0.08, TW_WU 0.08) X-ICS-MailScanner-SpamScore: ss X-ICS-MailScanner-From: dann@godzilla.ics.uci.edu X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:118677 Archived-At: Eduard Wiebe writes: > Hello, > > Following patch improves support for system processes on FreeBSD > machines. Does this work on other BSDs? We have a feature freeze now, so this can only get if approved by one of the maintainers. It would be a good idea to send this to bug-gnu-emacs@gnu.org so that it does not get lost. > 2009-12-14 Eduard Wiebe > > * sysdep.c (list_system_processes, system_process_attributes): Add > implementation for FreeBSD. > > diff --git a/src/sysdep.c b/src/sysdep.c > index b983694..b79e777 100644 > --- a/src/sysdep.c > +++ b/src/sysdep.c > @@ -52,6 +52,13 @@ along with GNU Emacs. If not, see . */ > > #include "blockinput.h" > > +#ifdef __FreeBSD__ > +#include > +#include > +#include */ > +#include > +#endif > + > #ifdef WINDOWSNT > #define read sys_read > #define write sys_write > @@ -3200,6 +3207,40 @@ list_system_processes () > return proclist; > } > > +#elif defined (__FreeBSD__) > + > +Lisp_Object > +list_system_processes () > +{ > + int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PROC}; > + size_t len; > + struct kinfo_proc *procs; > + size_t i; > + > + struct gcpro gcpro1; > + Lisp_Object proclist = Qnil; > + > + if (sysctl (mib, 3, NULL, &len, NULL, 0) != 0) > + return proclist; > + > + procs = xmalloc (len); > + if (sysctl (mib, 3, procs, &len, NULL, 0) != 0) > + { > + xfree (procs); > + return proclist; > + } > + > + GCPRO1 (proclist); > + len /= sizeof (struct kinfo_proc); > + for (i = 0; i < len; i++) > + proclist = Fcons (make_fixnum_or_float (procs[i].ki_pid), proclist); > + UNGCPRO; > + > + xfree (procs); > + > + return proclist; > +} > + > /* The WINDOWSNT implementation is in w32.c. > The MSDOS implementation is in dosfns.c. */ > #elif !defined (WINDOWSNT) && !defined (MSDOS) > @@ -3743,6 +3784,176 @@ system_process_attributes (Lisp_Object pid) > return attrs; > } > > +#elif defined(__FreeBSD__) > + > +Lisp_Object > +system_process_attributes (Lisp_Object pid) > +{ > + int proc_id; > + int pagesize = getpagesize(); > + int npages; > + int fscale; > + struct passwd *pw; > + struct group *gr; > + char *ttyname; > + size_t len; > + char args[MAXPATHLEN]; > + EMACS_TIME t, now; > + > + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID}; > + struct kinfo_proc proc; > + size_t proclen = sizeof(proc); > + > + struct gcpro gcpro1, gcpro2; > + Lisp_Object attrs = Qnil; > + Lisp_Object decoded_comm; > + > + CHECK_NUMBER_OR_FLOAT (pid); > + proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid); > + mib[3] = proc_id; > + > + if (sysctl (mib, 4, &proc, &proclen, NULL, 0) != 0) > + return attrs; > + > + GCPRO2 (attrs, decoded_comm); > + > + attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float(proc.ki_uid)), attrs); > + > + BLOCK_INPUT; > + pw = getpwuid (proc.ki_uid); > + UNBLOCK_INPUT; > + if (pw) > + attrs = Fcons (Fcons (Quser, build_string (pw->pw_name)), attrs); > + > + attrs = Fcons (Fcons (Qegid, make_fixnum_or_float(proc.ki_svgid)), attrs); > + > + BLOCK_INPUT; > + gr = getgrgid (proc.ki_svgid); > + UNBLOCK_INPUT; > + if (gr) > + attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs); > + > + decoded_comm = code_convert_string_norecord > + (make_unibyte_string (proc.ki_comm, strlen (proc.ki_comm)), > + Vlocale_coding_system, 0); > + > + attrs = Fcons (Fcons (Qcomm, decoded_comm), attrs); > + { > + char state[2] = {'\0', '\0'}; > + switch (proc.ki_stat) > + { > + case SRUN: > + state[0] = 'R'; > + break; > + > + case SSLEEP: > + state[0] = 'S'; > + break; > + > + case SLOCK: > + state[0] = 'D'; > + break; > + > + case SZOMB: > + state[0] = 'Z'; > + break; > + > + case SSTOP: > + state[0] = 'T'; > + break; > + } > + attrs = Fcons (Fcons (Qstate, build_string (state)), attrs); > + } > + > + attrs = Fcons (Fcons (Qppid, make_fixnum_or_float (proc.ki_ppid)), attrs); > + attrs = Fcons (Fcons (Qpgrp, make_fixnum_or_float (proc.ki_pgid)), attrs); > + attrs = Fcons (Fcons (Qsess, make_fixnum_or_float (proc.ki_sid)), attrs); > + > + BLOCK_INPUT; > + ttyname = proc.ki_tdev == NODEV ? NULL : devname (proc.ki_tdev, S_IFCHR); > + UNBLOCK_INPUT; > + if (ttyname) > + attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs); > + > + attrs = Fcons (Fcons (Qtpgid, make_fixnum_or_float (proc.ki_tpgid)), attrs); > + attrs = Fcons (Fcons (Qminflt, make_fixnum_or_float (proc.ki_rusage.ru_minflt)), attrs); > + attrs = Fcons (Fcons (Qmajflt, make_fixnum_or_float (proc.ki_rusage.ru_majflt)), attrs); > + attrs = Fcons (Fcons (Qcminflt, make_number (proc.ki_rusage_ch.ru_minflt)), attrs); > + attrs = Fcons (Fcons (Qcmajflt, make_number (proc.ki_rusage_ch.ru_majflt)), attrs); > + > +#define TIMELIST(ts) \ > + list3 (make_number (EMACS_SECS (ts) >> 16 & 0xffff), \ > + make_number (EMACS_SECS (ts) & 0xffff), \ > + make_number (EMACS_USECS (ts))) > + > + attrs = Fcons (Fcons (Qutime, TIMELIST(proc.ki_rusage.ru_utime)), attrs); > + attrs = Fcons (Fcons (Qstime, TIMELIST(proc.ki_rusage.ru_stime)), attrs); > + EMACS_ADD_TIME (t, proc.ki_rusage.ru_utime, proc.ki_rusage.ru_stime); > + attrs = Fcons (Fcons (Qtime, TIMELIST(t)), attrs); > + > + attrs = Fcons (Fcons (Qcutime, TIMELIST(proc.ki_rusage_ch.ru_utime)), attrs); > + attrs = Fcons (Fcons (Qcstime, TIMELIST(proc.ki_rusage_ch.ru_utime)), attrs); > + EMACS_ADD_TIME (t, proc.ki_rusage_ch.ru_utime, proc.ki_rusage_ch.ru_stime); > + attrs = Fcons (Fcons (Qctime, TIMELIST(t)), attrs); > + > + attrs = Fcons (Fcons (Qthcount, make_fixnum_or_float (proc.ki_numthreads)), attrs); > + attrs = Fcons (Fcons (Qpri, make_number (proc.ki_pri.pri_native)), attrs); > + attrs = Fcons (Fcons (Qnice, make_number (proc.ki_nice)), attrs); > + attrs = Fcons (Fcons (Qstart, TIMELIST(proc.ki_start)), attrs); > + attrs = Fcons (Fcons (Qvsize, make_number (proc.ki_size >> 10)), attrs); > + attrs = Fcons (Fcons (Qrss, make_number (proc.ki_rssize * pagesize >> 10)), attrs); > + > + EMACS_GET_TIME (now); > + EMACS_SUB_TIME (t, now, proc.ki_start); > + attrs = Fcons (Fcons (Qetime, TIMELIST(t)), attrs); > + > +#undef TIMELIST > + > + len = sizeof(fscale); > + if (sysctlbyname ("kern.fscale", &fscale, &len, NULL, 0) == 0) > + { > + float pcpu; > + fixpt_t ccpu; > + len = sizeof (ccpu); > + if (sysctlbyname ("kern.ccpu", &ccpu, &len, NULL, 0) == 0) > + { > + pcpu = 100.0 * ((double) proc.ki_pctcpu / fscale) > + / (1.0 - exp(proc.ki_swtime * log((double) ccpu / fscale))); > + attrs = Fcons (Fcons (Qpcpu, make_fixnum_or_float(pcpu)), attrs); > + } > + } > + > + len = sizeof(npages); > + if (sysctlbyname ("hw.availpages", &npages, &len, NULL, 0) == 0) > + { > + float pmem = proc.ki_flag & P_INMEM > + ? 100.0 * ((float) proc.ki_rssize / npages) > + : 0.0; > + attrs = Fcons (Fcons (Qpmem, make_fixnum_or_float(pmem)), attrs); > + } > + > + mib[2] = KERN_PROC_ARGS; > + len = MAXPATHLEN; > + if (sysctl (mib, 4, args, &len, NULL, 0) == 0) > + { > + int i; > + for (i = 0; i < len; i++) > + { > + if (! args[i] && i < len - 1) > + args[i] = ' '; > + } > + > + decoded_comm = code_convert_string_norecord > + (make_unibyte_string (args, strlen (args)), > + Vlocale_coding_system, 0); > + > + attrs = Fcons (Fcons (Qargs, decoded_comm), attrs); > + } > + > + UNGCPRO; > + return attrs; > +} > + > /* The WINDOWSNT implementation is in w32.c. > The MSDOS implementation is in dosfns.c. */ > #elif !defined (WINDOWSNT) && !defined (MSDOS) > > -- > Eduard Wiebe