[Xfce4-commits] <xfce4-taskmanager:master> WIP on OpenBSD support

Landry Breuil noreply at xfce.org
Thu May 13 18:40:01 CEST 2010


Updating branch refs/heads/master
         to 3acd33040055d460b7c901bd88a6ffc40e9fc827 (commit)
       from 1bd6ca0add969e4af7128425431abc0f8fcea43c (commit)

commit 3acd33040055d460b7c901bd88a6ffc40e9fc827
Author: Landry Breuil <landry at rhaalovely.net>
Date:   Thu May 13 18:36:17 2010 +0200

    WIP on OpenBSD support
    
    - update wrt new Task structure
    - handle zombie processes
    - get full cmdline
    rework

 src/{taskmanager-bsd.c => task-manager-bsd.c} |  142 ++++++++++++++++---------
 1 files changed, 91 insertions(+), 51 deletions(-)

diff --git a/src/taskmanager-bsd.c b/src/task-manager-bsd.c
similarity index 51%
rename from src/taskmanager-bsd.c
rename to src/task-manager-bsd.c
index b712c3d..2e94083 100644
--- a/src/taskmanager-bsd.c
+++ b/src/task-manager-bsd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008 Landry Breuil <landry at xfce.org>
+ * Copyright (c) 2008-2010 Landry Breuil <landry at xfce.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -16,28 +16,30 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-#include "taskmanager.h"
+#include <stdlib.h>
 /* for getpwuid() */
 #include <sys/types.h>
 #include <pwd.h>
 /* for sysctl() */
 #include <sys/param.h>
+#include <sys/sched.h>
 #include <sys/sysctl.h>
 /* for kill() */
 #include <signal.h>
 #include <err.h>
 
+#include "task-manager.h"
+
 char	*state_abbrev[] = {
 	"", "start", "run", "sleep", "stop", "zomb", "dead", "onproc"
 };
 
-GArray *get_task_list(void)
+gboolean get_task_list (GArray *task_list)
 {
-	GArray *task_list;
 	int mib[6];
 	size_t size;
 	struct kinfo_proc2 *kp;
-	struct task t;
+	Task t;
 	struct passwd *passwdp;
 	double d;
 	char **args, **ptr;
@@ -46,7 +48,7 @@ GArray *get_task_list(void)
 	fixpt_t ccpu; /* The scheduler exponential decay value. */
 	int fscale; /* The kernel fixed-point scale factor. */
 
-	task_list = g_array_new (FALSE, FALSE, sizeof (struct task));
+//	task_list = g_array_new (FALSE, FALSE, sizeof (struct task));
 
 	mib[0] = CTL_KERN;
 	mib[1] = KERN_PROC2;
@@ -66,59 +68,98 @@ GArray *get_task_list(void)
 	for (i=0 ; i < nproc ; i++)
 	{
 		struct kinfo_proc2 p = kp[i];
-		t.checked = FALSE;
 		t.pid = p.p_pid;
 		t.ppid = p.p_ppid;
 		t.uid = p.p_uid;
-		t.prio = p.p_priority - 22;
-		t.vsize = p.p_vm_dsize + p.p_vm_ssize + p.p_vm_tsize;
-		t.vsize *= getpagesize();
-		t.rss = p.p_vm_rssize;
+		t.prio = p.p_priority - PZERO;
+		t.vsz = p.p_vm_dsize + p.p_vm_ssize + p.p_vm_tsize;
+		t.vsz *= getpagesize();
+		t.rss = p.p_vm_rssize * getpagesize();
 		g_snprintf(t.state, sizeof t.state, "%s", state_abbrev[p.p_stat]);
 		/* shamelessly stolen from top/machine.c */
 		/* short version: g_strlcpy(t.name, p.p_comm, strlen(p.p_comm) + 1); */
-		size = 128;
-		if ((args = malloc(size)) == NULL)
-			errx(1,"failed to allocate memory for argv structures");
-		for (;; size *= 2) {
-			if ((args = realloc(args, size)) == NULL)
+		if (P_ZOMBIE(&p)) {
+			g_strlcpy(t.name, p.p_comm, strlen(p.p_comm) + 1);
+		} else {
+			size = 128;
+			if ((args = malloc(size)) == NULL)
 				errx(1,"failed to allocate memory for argv structures");
-			mib[0] = CTL_KERN;
-			mib[1] = KERN_PROC_ARGS;
-			mib[2] = t.pid;
-			mib[3] = KERN_PROC_ARGV;
-			if (sysctl(mib, 4, args, &size, NULL, 0) == 0)
-				break;
-		}
-		buf[0] = '\0';
-		for (ptr = args; *ptr != NULL; ptr++) {
-			if (ptr != args)
-				strlcat(buf, " ", sizeof(buf));
-			strlcat(buf, *ptr, sizeof(buf));
+			for (;; size *= 2) {
+				if ((args = realloc(args, size)) == NULL)
+					errx(1,"failed to allocate memory for argv structures of pid %d",t.pid);
+				mib[0] = CTL_KERN;
+				mib[1] = KERN_PROC_ARGS;
+				mib[2] = t.pid;
+				mib[3] = KERN_PROC_ARGV;
+				if (sysctl(mib, 4, args, &size, NULL, 0) == 0)
+					break;
+			}
+			buf[0] = '\0';
+			for (ptr = args; *ptr != NULL; ptr++) {
+				if (ptr != args)
+					strlcat(buf, " ", sizeof(buf));
+				strlcat(buf, *ptr, sizeof(buf));
+			}
+			free(args);
+			/* TODO: set difference */
+			g_snprintf(t.name, sizeof t.name, "%s", buf);
+			g_strlcpy(t.cmdline, t.name, sizeof t.name);
 		}
-		g_snprintf(t.name, sizeof t.name, "%s", buf);
 
-		t.time_percentage = (100.0 * ((double) p.p_pctcpu / FSCALE));
+		t.cpu_user = (100.0 * ((double) p.p_pctcpu / FSCALE));
+		t.cpu_system = 0; /* TODO ? */
 		/* get username from uid */
 		passwdp = getpwuid(t.uid);
 		if(passwdp != NULL && passwdp->pw_name != NULL)
-			g_strlcpy(t.uname, passwdp->pw_name, sizeof t.uname);
+			g_strlcpy(t.uid_name, passwdp->pw_name, sizeof t.uid_name);
 		g_array_append_val(task_list, t);
 	}
+	free(kp);
 
-	return task_list;
+	return TRUE;
 }
 
-gboolean get_cpu_usage_from_proc(system_status *sys_stat)
+gboolean
+pid_is_sleeping (guint pid)
 {
-	/* tosee: remove this, get cpu perc from CPTIME */
 	return FALSE;
 }
 
+gboolean get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system)
+{
+	static gulong cur_user = 0, cur_system = 0, cur_total = 0;
+	static gulong old_user = 0, old_system = 0, old_total = 0;
+
+	int mib[] = {CTL_KERN, KERN_CPTIME};
+ 	glong cp_time[CPUSTATES];
+ 	gsize size = sizeof( cp_time );
+	if (sysctl(mib, 2, &cp_time, &size, NULL, 0) < 0)
+		errx(1,"failed to get kern.cptime");
+
+	old_user = cur_user;
+	old_system = cur_system;
+	old_total = cur_total;
+
+	cur_user = cp_time[CP_USER] + cp_time[CP_NICE];
+	cur_system = cp_time[CP_SYS] + cp_time[CP_INTR];
+	cur_total = cur_user + cur_system + cp_time[CP_IDLE];
+
+	*cpu_user = (old_total > 0) ? (cur_user - old_user) * 100 / (gdouble)(cur_total - old_total) : 0;
+	*cpu_system = (old_total > 0) ? (cur_system - old_system) * 100 / (gdouble)(cur_total - old_total) : 0;
+
+	/* get #cpu */
+	size = sizeof(&cpu_count);
+	mib[0] = CTL_HW;
+	mib[1] = HW_NCPU;
+	if (sysctl(mib, 2, cpu_count, &size, NULL, 0) == -1)
+		errx(1,"failed to get cpu count");
+	return TRUE;
+}
+
 /* vmtotal values in #pg, mem wanted in kB */
 #define pagetok(nb) ((nb) * (getpagesize() / 1024))
 
-gboolean get_system_status (system_status *sys_stat)
+gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
 {
 	int mib[] = {CTL_VM, VM_METER};
 	struct vmtotal vmtotal;
@@ -127,42 +168,41 @@ gboolean get_system_status (system_status *sys_stat)
 	if (sysctl(mib, 2, &vmtotal, &size, NULL, 0) < 0)
 		errx(1,"failed to get vm.meter");
 	/* cheat : rm = tot used, add free to get total */
-	sys_stat->mem_total = pagetok(vmtotal.t_rm + vmtotal.t_free);
-	sys_stat->mem_free = pagetok(vmtotal.t_free);
-	sys_stat->mem_cached = 0;
-	sys_stat->mem_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm);
-	size = sizeof(sys_stat->cpu_count);
-	mib[0] = CTL_HW;
-	mib[1] = HW_NCPU;
-	if (sysctl(mib, 2, &sys_stat->cpu_count, &size, NULL, 0) == -1)
-		errx(1,"failed to get cpu count");
-	/* cpu_user/idle/system unused atm so we don't care */
+	*memory_total = pagetok(vmtotal.t_rm + vmtotal.t_free);
+	*memory_free = pagetok(vmtotal.t_free);
+	*memory_cache = 0;
+	*memory_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm);
+	/* XXX:TODO */
+	*swap_total = 0;
+	*swap_free = 0;
 	return TRUE;
 }
 
-void send_signal_to_task(gint task_id, gint signal)
+gboolean send_signal_to_pid (guint task_id, gint signal)
 {
+	gint ret = 0;
 	if(task_id > 0 && signal != 0)
 	{
-		gint ret = 0;
 		
 		ret = kill(task_id, signal);
-
+/*
 		if(ret != 0)
 			xfce_err(_("Couldn't send signal %d to the task with ID %d"), signal, task_id);
-	}
+*/	}
+	return ret;
 }
 
 
-void set_priority_to_task(gint task_id, gint prio)
+gboolean set_priority_to_pid (guint task_id, gint prio)
 {
 	if(task_id > 0)
 	{
 		gchar command[128] = "";
+		/* TODO : syscall */
 		g_snprintf(command, 128, "renice %d %d > /dev/null", prio, task_id);
 		
 		if(system(command) != 0)
-			xfce_err(_("Couldn't set priority %d to the task with ID %d"), prio, task_id);
+			;//xfce_err(_("Couldn't set priority %d to the task with ID %d"), prio, task_id);
 	}
 }
 



More information about the Xfce4-commits mailing list