aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysdep.c
diff options
context:
space:
mode:
authorPaul Eggert2012-04-21 17:53:32 -0700
committerPaul Eggert2012-04-21 17:53:32 -0700
commitbbd347f5f7e99da1a559dad818b5fa8f59c0901e (patch)
tree77c1fc54c2240b08d2859109d18cac8812a8ffb1 /src/sysdep.c
parente4ecdc9c71af4199129d5dd2db1a32ff6b725fe4 (diff)
parent9ee7d8b93cb143b473e6dffb708e777bc6fe5bd0 (diff)
downloademacs-bbd347f5f7e99da1a559dad818b5fa8f59c0901e.tar.gz
emacs-bbd347f5f7e99da1a559dad818b5fa8f59c0901e.zip
Merge from trunk.
Diffstat (limited to 'src/sysdep.c')
-rw-r--r--src/sysdep.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/sysdep.c b/src/sysdep.c
index 426c6832347..4df1f50a096 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -37,6 +37,13 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
37#include "sysselect.h" 37#include "sysselect.h"
38#include "blockinput.h" 38#include "blockinput.h"
39 39
40#ifdef __FreeBSD__
41#include <sys/sysctl.h>
42#include <sys/user.h>
43#include <sys/resource.h> */
44#include <math.h>
45#endif
46
40#ifdef WINDOWSNT 47#ifdef WINDOWSNT
41#define read sys_read 48#define read sys_read
42#define write sys_write 49#define write sys_write
@@ -2530,6 +2537,40 @@ list_system_processes (void)
2530 return proclist; 2537 return proclist;
2531} 2538}
2532 2539
2540#elif defined (__FreeBSD__)
2541
2542Lisp_Object
2543list_system_processes ()
2544{
2545 int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PROC};
2546 size_t len;
2547 struct kinfo_proc *procs;
2548 size_t i;
2549
2550 struct gcpro gcpro1;
2551 Lisp_Object proclist = Qnil;
2552
2553 if (sysctl (mib, 3, NULL, &len, NULL, 0) != 0)
2554 return proclist;
2555
2556 procs = xmalloc (len);
2557 if (sysctl (mib, 3, procs, &len, NULL, 0) != 0)
2558 {
2559 xfree (procs);
2560 return proclist;
2561 }
2562
2563 GCPRO1 (proclist);
2564 len /= sizeof (struct kinfo_proc);
2565 for (i = 0; i < len; i++)
2566 proclist = Fcons (make_fixnum_or_float (procs[i].ki_pid), proclist);
2567 UNGCPRO;
2568
2569 xfree (procs);
2570
2571 return proclist;
2572}
2573
2533/* The WINDOWSNT implementation is in w32.c. 2574/* The WINDOWSNT implementation is in w32.c.
2534 The MSDOS implementation is in dosfns.c. */ 2575 The MSDOS implementation is in dosfns.c. */
2535#elif !defined (WINDOWSNT) && !defined (MSDOS) 2576#elif !defined (WINDOWSNT) && !defined (MSDOS)
@@ -3077,6 +3118,176 @@ system_process_attributes (Lisp_Object pid)
3077 return attrs; 3118 return attrs;
3078} 3119}
3079 3120
3121#elif defined(__FreeBSD__)
3122
3123Lisp_Object
3124system_process_attributes (Lisp_Object pid)
3125{
3126 int proc_id;
3127 int pagesize = getpagesize();
3128 int npages;
3129 int fscale;
3130 struct passwd *pw;
3131 struct group *gr;
3132 char *ttyname;
3133 size_t len;
3134 char args[MAXPATHLEN];
3135 EMACS_TIME t, now;
3136
3137 int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID};
3138 struct kinfo_proc proc;
3139 size_t proclen = sizeof(proc);
3140
3141 struct gcpro gcpro1, gcpro2;
3142 Lisp_Object attrs = Qnil;
3143 Lisp_Object decoded_comm;
3144
3145 CHECK_NUMBER_OR_FLOAT (pid);
3146 proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid);
3147 mib[3] = proc_id;
3148
3149 if (sysctl (mib, 4, &proc, &proclen, NULL, 0) != 0)
3150 return attrs;
3151
3152 GCPRO2 (attrs, decoded_comm);
3153
3154 attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float(proc.ki_uid)), attrs);
3155
3156 BLOCK_INPUT;
3157 pw = getpwuid (proc.ki_uid);
3158 UNBLOCK_INPUT;
3159 if (pw)
3160 attrs = Fcons (Fcons (Quser, build_string (pw->pw_name)), attrs);
3161
3162 attrs = Fcons (Fcons (Qegid, make_fixnum_or_float(proc.ki_svgid)), attrs);
3163
3164 BLOCK_INPUT;
3165 gr = getgrgid (proc.ki_svgid);
3166 UNBLOCK_INPUT;
3167 if (gr)
3168 attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs);
3169
3170 decoded_comm = code_convert_string_norecord
3171 (make_unibyte_string (proc.ki_comm, strlen (proc.ki_comm)),
3172 Vlocale_coding_system, 0);
3173
3174 attrs = Fcons (Fcons (Qcomm, decoded_comm), attrs);
3175 {
3176 char state[2] = {'\0', '\0'};
3177 switch (proc.ki_stat)
3178 {
3179 case SRUN:
3180 state[0] = 'R';
3181 break;
3182
3183 case SSLEEP:
3184 state[0] = 'S';
3185 break;
3186
3187 case SLOCK:
3188 state[0] = 'D';
3189 break;
3190
3191 case SZOMB:
3192 state[0] = 'Z';
3193 break;
3194
3195 case SSTOP:
3196 state[0] = 'T';
3197 break;
3198 }
3199 attrs = Fcons (Fcons (Qstate, build_string (state)), attrs);
3200 }
3201
3202 attrs = Fcons (Fcons (Qppid, make_fixnum_or_float (proc.ki_ppid)), attrs);
3203 attrs = Fcons (Fcons (Qpgrp, make_fixnum_or_float (proc.ki_pgid)), attrs);
3204 attrs = Fcons (Fcons (Qsess, make_fixnum_or_float (proc.ki_sid)), attrs);
3205
3206 BLOCK_INPUT;
3207 ttyname = proc.ki_tdev == NODEV ? NULL : devname (proc.ki_tdev, S_IFCHR);
3208 UNBLOCK_INPUT;
3209 if (ttyname)
3210 attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs);
3211
3212 attrs = Fcons (Fcons (Qtpgid, make_fixnum_or_float (proc.ki_tpgid)), attrs);
3213 attrs = Fcons (Fcons (Qminflt, make_fixnum_or_float (proc.ki_rusage.ru_minflt)), attrs);
3214 attrs = Fcons (Fcons (Qmajflt, make_fixnum_or_float (proc.ki_rusage.ru_majflt)), attrs);
3215 attrs = Fcons (Fcons (Qcminflt, make_number (proc.ki_rusage_ch.ru_minflt)), attrs);
3216 attrs = Fcons (Fcons (Qcmajflt, make_number (proc.ki_rusage_ch.ru_majflt)), attrs);
3217
3218#define TIMELIST(ts) \
3219 list3 (make_number (EMACS_SECS (ts) >> 16 & 0xffff), \
3220 make_number (EMACS_SECS (ts) & 0xffff), \
3221 make_number (EMACS_USECS (ts)))
3222
3223 attrs = Fcons (Fcons (Qutime, TIMELIST(proc.ki_rusage.ru_utime)), attrs);
3224 attrs = Fcons (Fcons (Qstime, TIMELIST(proc.ki_rusage.ru_stime)), attrs);
3225 EMACS_ADD_TIME (t, proc.ki_rusage.ru_utime, proc.ki_rusage.ru_stime);
3226 attrs = Fcons (Fcons (Qtime, TIMELIST(t)), attrs);
3227
3228 attrs = Fcons (Fcons (Qcutime, TIMELIST(proc.ki_rusage_ch.ru_utime)), attrs);
3229 attrs = Fcons (Fcons (Qcstime, TIMELIST(proc.ki_rusage_ch.ru_utime)), attrs);
3230 EMACS_ADD_TIME (t, proc.ki_rusage_ch.ru_utime, proc.ki_rusage_ch.ru_stime);
3231 attrs = Fcons (Fcons (Qctime, TIMELIST(t)), attrs);
3232
3233 attrs = Fcons (Fcons (Qthcount, make_fixnum_or_float (proc.ki_numthreads)), attrs);
3234 attrs = Fcons (Fcons (Qpri, make_number (proc.ki_pri.pri_native)), attrs);
3235 attrs = Fcons (Fcons (Qnice, make_number (proc.ki_nice)), attrs);
3236 attrs = Fcons (Fcons (Qstart, TIMELIST(proc.ki_start)), attrs);
3237 attrs = Fcons (Fcons (Qvsize, make_number (proc.ki_size >> 10)), attrs);
3238 attrs = Fcons (Fcons (Qrss, make_number (proc.ki_rssize * pagesize >> 10)), attrs);
3239
3240 EMACS_GET_TIME (now);
3241 EMACS_SUB_TIME (t, now, proc.ki_start);
3242 attrs = Fcons (Fcons (Qetime, TIMELIST(t)), attrs);
3243
3244#undef TIMELIST
3245
3246 len = sizeof(fscale);
3247 if (sysctlbyname ("kern.fscale", &fscale, &len, NULL, 0) == 0)
3248 {
3249 float pcpu;
3250 fixpt_t ccpu;
3251 len = sizeof (ccpu);
3252 if (sysctlbyname ("kern.ccpu", &ccpu, &len, NULL, 0) == 0)
3253 {
3254 pcpu = 100.0 * ((double) proc.ki_pctcpu / fscale)
3255 / (1.0 - exp(proc.ki_swtime * log((double) ccpu / fscale)));
3256 attrs = Fcons (Fcons (Qpcpu, make_fixnum_or_float(pcpu)), attrs);
3257 }
3258 }
3259
3260 len = sizeof(npages);
3261 if (sysctlbyname ("hw.availpages", &npages, &len, NULL, 0) == 0)
3262 {
3263 float pmem = proc.ki_flag & P_INMEM
3264 ? 100.0 * ((float) proc.ki_rssize / npages)
3265 : 0.0;
3266 attrs = Fcons (Fcons (Qpmem, make_fixnum_or_float(pmem)), attrs);
3267 }
3268
3269 mib[2] = KERN_PROC_ARGS;
3270 len = MAXPATHLEN;
3271 if (sysctl (mib, 4, args, &len, NULL, 0) == 0)
3272 {
3273 int i;
3274 for (i = 0; i < len; i++)
3275 {
3276 if (! args[i] && i < len - 1)
3277 args[i] = ' ';
3278 }
3279
3280 decoded_comm = code_convert_string_norecord
3281 (make_unibyte_string (args, strlen (args)),
3282 Vlocale_coding_system, 0);
3283
3284 attrs = Fcons (Fcons (Qargs, decoded_comm), attrs);
3285 }
3286
3287 UNGCPRO;
3288 return attrs;
3289}
3290
3080/* The WINDOWSNT implementation is in w32.c. 3291/* The WINDOWSNT implementation is in w32.c.
3081 The MSDOS implementation is in dosfns.c. */ 3292 The MSDOS implementation is in dosfns.c. */
3082#elif !defined (WINDOWSNT) && !defined (MSDOS) 3293#elif !defined (WINDOWSNT) && !defined (MSDOS)