[Xfce4-commits] <xfce4-taskmanager:master> Re-add Solaris implementation
Mike Massonnet
noreply at xfce.org
Sun May 16 13:54:01 CEST 2010
Updating branch refs/heads/master
to db0ab6056146f6d5a74dfa78b708baea38062946 (commit)
from ee9bd057fde481b90143a363c5158d39e1610c7b (commit)
commit db0ab6056146f6d5a74dfa78b708baea38062946
Author: Mike Massonnet <mmassonnet at xfce.org>
Date: Sun May 16 13:50:08 2010 +0200
Re-add Solaris implementation
Solaris support is in again however the Swap usage is missing. Older
files from the tree source have been removed.
src/task-manager-solaris.c | 217 ++++++++++++++++++++++++++++++++++++++++++
src/taskmanager-solaris.c | 224 --------------------------------------------
src/taskmanager.h | 35 -------
src/types.h | 102 --------------------
4 files changed, 217 insertions(+), 361 deletions(-)
diff --git a/src/task-manager-solaris.c b/src/task-manager-solaris.c
new file mode 100644
index 0000000..afb8344
--- /dev/null
+++ b/src/task-manager-solaris.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2010 Mike Massonnet <mmassonnet at xfce.org>
+ * Copyright (c) 2009 Peter Tribble <peter.tribble at gmail.com>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <kstat.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <procfs.h>
+#include <sys/procfs.h>
+
+#include <glib.h>
+
+#include "task-manager.h"
+
+static kstat_ctl_t *kc;
+static gushort _cpu_count = 0;
+
+static void
+init_stats ()
+{
+ kc = kstat_open ();
+}
+
+gboolean
+get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
+{
+ kstat_t *ksp;
+ kstat_named_t *knp;
+
+ if (!kc)
+ init_stats();
+
+ if (!(ksp = kstat_lookup (kc, "unix", 0, "system_pages")))
+ return FALSE;
+ kstat_read (kc, ksp, NULL);
+ knp = kstat_data_lookup (ksp, "physmem");
+ *memory_total = getpagesize () * knp->value.ui64;
+ knp = kstat_data_lookup (ksp, "freemem");
+ *memory_free = getpagesize () * knp->value.ui64;
+ *memory_cache = 0;
+
+ if (!(ksp = kstat_lookup (kc, "unix", 0, "vminfo")))
+ return FALSE;
+ kstat_read (kc, ksp, NULL);
+ // TODO read swap usage
+ //knp = kstat_data_lookup (ksp, "...");
+ *swap_total = 0;
+ *swap_free = 0;
+
+ return TRUE;
+}
+
+static void
+get_cpu_percent (guint pid, gulong ticks_user, gfloat *cpu_user, gulong ticks_system, gfloat *cpu_system)
+{
+ static GHashTable *hash_cpu_user = NULL;
+ static GHashTable *hash_cpu_system = NULL;
+ gulong ticks_user_old, ticks_system_old;
+
+ if (hash_cpu_user == NULL)
+ {
+ hash_cpu_user = g_hash_table_new (NULL, NULL);
+ hash_cpu_system = g_hash_table_new (NULL, NULL);
+ }
+
+ ticks_user_old = GPOINTER_TO_UINT (g_hash_table_lookup (hash_cpu_user, GUINT_TO_POINTER (pid)));
+ ticks_system_old = GPOINTER_TO_UINT (g_hash_table_lookup (hash_cpu_system, GUINT_TO_POINTER (pid)));
+ g_hash_table_insert (hash_cpu_user, GUINT_TO_POINTER (pid), GUINT_TO_POINTER (ticks_user));
+ g_hash_table_insert (hash_cpu_system, GUINT_TO_POINTER (pid), GUINT_TO_POINTER (ticks_system));
+
+ if (ticks_user < ticks_user_old || ticks_system < ticks_system_old)
+ return;
+
+ if (_cpu_count > 0)
+ {
+ *cpu_user = (ticks_user_old > 0) ? (ticks_user - ticks_user_old) / (gfloat)_cpu_count : 0;
+ *cpu_system = (ticks_system_old > 0) ? (ticks_system - ticks_system_old) / (gfloat)_cpu_count : 0;
+ }
+ else
+ {
+ *cpu_user = *cpu_system = 0;
+ }
+}
+
+gboolean
+get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system)
+{
+ kstat_t *ksp;
+ kstat_named_t *knp;
+ gulong ticks_user = 0, ticks_system = 0;
+
+ if (!kc)
+ init_stats ();
+
+ _cpu_count = 0;
+ kstat_chain_update (kc);
+
+ for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next)
+ {
+ if (!g_strcmp0 (ksp->ks_module, "cpu_info"))
+ {
+ _cpu_count += 1;
+ }
+ else if (!g_strcmp0 (ksp->ks_module, "cpu") && !g_strcmp0 (ksp->ks_name, "sys"))
+ {
+ // TODO switch ticks to nsec for better precision
+ kstat_read (kc, ksp, NULL);
+ knp = kstat_data_lookup (ksp, "cpu_ticks_user");
+ ticks_user += knp->value.ul;
+ knp = kstat_data_lookup (ksp, "cpu_ticks_kernel");
+ ticks_system += knp->value.ul;
+ }
+ }
+
+ get_cpu_percent (0, ticks_user, cpu_user, ticks_system, cpu_system);
+ *cpu_count = _cpu_count;
+
+ return TRUE;
+}
+
+static gboolean
+get_task_details (guint pid, Task *task)
+{
+ FILE *file;
+ gchar filename[96];
+ gchar pstate[2];
+ struct passwd *pw;
+ psinfo_t process;
+
+ snprintf (filename, 96, "/proc/%d/psinfo", pid);
+ if ((file = fopen (filename, "r")) == NULL)
+ return FALSE;
+
+ if (fread (&process, sizeof (psinfo_t), 1, file) != 1)
+ {
+ fclose (file);
+ return FALSE;
+ }
+
+ task->pid = (guint)process.pr_pid;
+ task->ppid = (guint)process.pr_ppid;
+ g_strlcpy (task->name, process.pr_fname, 256);
+ snprintf (task->cmdline, 1024, "%s", process.pr_psargs);
+ snprintf (task->state, 16, "%c", process.pr_lwp.pr_sname);
+ task->vsz = (guint64)process.pr_size * 1024;
+ task->rss = (guint64)process.pr_rssize * 1024;
+ task->prio = (gushort)process.pr_lwp.pr_pri;
+ pw = getpwuid (process.pr_uid);
+ task->uid = (guint)process.pr_uid;
+ g_strlcpy (task->uid_name, (pw != NULL) ? pw->pw_name : "nobody", sizeof (task->uid_name));
+ get_cpu_percent (task->pid, process.pr_time.tv_sec * 100000 + process.pr_time.tv_nsec / 1000, &task->cpu_user, 0, &task->cpu_system);
+ task->cpu_user /= 10000;
+
+ fclose (file);
+
+ return TRUE;
+}
+
+gboolean
+get_task_list (GArray *task_list)
+{
+ GDir *dir;
+ const gchar *name;
+ guint pid;
+ Task task = { 0 };
+
+ if ((dir = g_dir_open ("/proc", 0, NULL)) == NULL)
+ return FALSE;
+
+ while ((name = g_dir_read_name(dir)) != NULL)
+ {
+ if ((pid = (guint)g_ascii_strtoull (name, NULL, 0)) > 0)
+ {
+ if (get_task_details (pid, &task))
+ g_array_append_val(task_list, task);
+ }
+ }
+
+ g_dir_close (dir);
+
+ return FALSE;
+}
+
+gboolean
+pid_is_sleeping (guint pid)
+{
+ FILE *file;
+ gchar filename[96];
+ gchar state[2];
+ psinfo_t process;
+
+ snprintf (filename, 96, "/proc/%d/psinfo", pid);
+ if ((file = fopen (filename, "r")) == NULL)
+ return FALSE;
+
+ if (fread (&process, sizeof (psinfo_t), 1, file) != 1)
+ {
+ fclose (file);
+ return FALSE;
+ }
+
+ snprintf (state, 2, "%c", process.pr_lwp.pr_sname);
+ fclose (file);
+
+ return (state[0] == 'T') ? TRUE : FALSE;
+}
+
diff --git a/src/taskmanager-solaris.c b/src/taskmanager-solaris.c
deleted file mode 100644
index fc3e806..0000000
--- a/src/taskmanager-solaris.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 2009 Peter Tribble <peter.tribble at gmail.com>
- *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Library General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include "taskmanager.h"
-
-#include <dirent.h>
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdlib.h>
-#include <string.h>
-#include <kstat.h>
-#include <fcntl.h>
-#include <procfs.h>
-#include <sys/procfs.h>
-
-kstat_ctl_t *kc;
-
-static void init_stats()
-{
- kc = kstat_open();
-}
-
-struct task get_task_details(gint pid)
-{
- struct task task;
- gchar filename[255];
- gchar pstate[2];
- int fd;
- struct passwd *passwdp;
- struct psinfo thisproc;
-
- sprintf(filename, "/proc/%i/psinfo", pid);
-
- task.pid = pid;
- task.checked = FALSE;
-
- if ((fd = open(filename, O_RDONLY)) > 0)
- {
- if (read(fd, &thisproc, sizeof(psinfo_t)) == sizeof(psinfo_t))
- {
- g_strlcpy(task.name,thisproc.pr_fname,64);
- sprintf(pstate, "%c", thisproc.pr_lwp.pr_sname);
- g_strlcpy(task.state, pstate, 16);
- task.ppid = (gint) thisproc.pr_ppid;
- task.prio = (gint) thisproc.pr_lwp.pr_pri;
- task.vsize = (gint) thisproc.pr_size*1024;
- task.rss = (gint) thisproc.pr_rssize*1024;
- task.uid = (gint) thisproc.pr_uid;
- passwdp = getpwuid(thisproc.pr_uid);
- if(passwdp != NULL && passwdp->pw_name != NULL)
- g_strlcpy(task.uname, passwdp->pw_name, sizeof task.uname);
- /*
- * To get the appropriate precision we need to multiply up by 10000
- * so that when we convert to a percentage we can represent 0.01%.
- */
- task.old_time = task.time;
- task.time = 10000*thisproc.pr_time.tv_sec + thisproc.pr_time.tv_nsec/100000;
- task.time_percentage = 0;
- }
- close(fd);
- }
-
- return task;
-}
-
-GArray *get_task_list(void)
-{
- DIR *dir;
- struct dirent *dir_entry;
- GArray *task_list;
-
- task_list = g_array_new (FALSE, FALSE, sizeof (struct task));
-
- if((dir = opendir("/proc/")) == NULL)
- {
- fprintf(stderr, "Error: couldn't load the /proc directory\n");
- return NULL;
- }
-
- gint count = 0;
-
- while((dir_entry = readdir(dir)) != NULL)
- {
- if(atoi(dir_entry->d_name) != 0)
- {
- struct task task = get_task_details(atoi(dir_entry->d_name));
- if(task.pid != -1)
- g_array_append_val(task_list, task);
- }
- count++;
- }
-
- closedir(dir);
-
- return task_list;
-}
-
-gboolean get_cpu_usage_from_proc(system_status *sys_stat)
-{
- gboolean retval = FALSE;
- kstat_t *ksp;
- kstat_named_t *knp;
-
- if (!kc)
- {
- init_stats();
- }
-
- if ( sys_stat->valid_proc_reading == TRUE ) {
- sys_stat->cpu_old_jiffies =
- sys_stat->cpu_user +
- sys_stat->cpu_nice +
- sys_stat->cpu_system+
- sys_stat->cpu_idle;
- sys_stat->cpu_old_used =
- sys_stat->cpu_user +
- sys_stat->cpu_nice +
- sys_stat->cpu_system;
- } else {
- sys_stat->cpu_old_jiffies = 0;
- }
-
- sys_stat->valid_proc_reading = FALSE;
-
- kstat_chain_update(kc);
-
- for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next)
- {
- if (!strcmp(ksp->ks_module, "cpu") && !strcmp(ksp->ks_name, "sys"))
- {
- kstat_read(kc, ksp, NULL);
- knp = kstat_data_lookup(ksp, "cpu_ticks_user");
- sys_stat->cpu_user = knp->value.ui64;
- knp = kstat_data_lookup(ksp, "cpu_ticks_kernel");
- sys_stat->cpu_system = knp->value.ui64;
- knp = kstat_data_lookup(ksp, "cpu_ticks_idle");
- sys_stat->cpu_idle = knp->value.ui64;
- sys_stat->cpu_nice = 0L;
- sys_stat->valid_proc_reading = TRUE;
- retval = TRUE;
- }
- }
- return retval;
-}
-
-gboolean get_system_status (system_status *sys_stat)
-{
- kstat_t *ksp;
- kstat_named_t *knp;
-
- if (!kc)
- {
- init_stats();
- }
-
- if (ksp = kstat_lookup(kc, "unix", 0, "system_pages"))
- {
- kstat_read(kc, ksp, NULL);
- knp = kstat_data_lookup(ksp, "physmem");
- sys_stat->mem_total = (getpagesize()*knp->value.ui64)/1024;
- knp = kstat_data_lookup(ksp, "freemem");
- sys_stat->mem_free = (getpagesize()*knp->value.ui64)/1024;
- sys_stat->mem_cached = 0;
- }
-
- sys_stat->cpu_count = 0;
- kstat_chain_update(kc);
-
- for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next)
- {
- if (!strcmp(ksp->ks_module, "cpu_info"))
- {
- sys_stat->cpu_count++;
- }
- }
-
- return TRUE;
-}
-
-void send_signal_to_task(gint task_id, gint signal)
-{
- 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);
- }
-}
-
-
-void set_priority_to_task(gint task_id, gint prio)
-{
- if(task_id > 0)
- {
- gchar command[128] = "";
- g_snprintf(command, 128, "/usr/bin/priocntl -s -p %d -i pid %d > /dev/null", prio, task_id);
- /*
- * priocntl always returns 0, so this test is useless until
- * priocntl gets fixed
- */
- if(system(command) != 0)
- xfce_err(_("Couldn't set priority %d to the task with ID %d"), prio, task_id);
- }
-}
-
diff --git a/src/taskmanager.h b/src/taskmanager.h
deleted file mode 100644
index 79cdc0e..0000000
--- a/src/taskmanager.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2006 Johannes Zellner <webmaster at nebulon.de>
- * Copyright (c) 2008 Mike Massonnet <mmassonnet 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Library General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TASKMANAGER_H
-#define TASKMANAGER_H
-
-#include <glib.h>
-#include <libxfcegui4/libxfcegui4.h>
-
-#include "types.h"
-
-GArray *get_task_list(void);
-gboolean get_system_status(system_status *sys_stat);
-gboolean get_cpu_usage_from_proc(system_status *sys_stat);
-void send_signal_to_task(gint task_id, gint signal);
-void set_priority_to_task(gint task_id, gint prio);
-
-#endif
-
diff --git a/src/types.h b/src/types.h
deleted file mode 100644
index 56e617e..0000000
--- a/src/types.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* $Id$
- *
- * Copyright (c) 2006 Johannes Zellner <webmaster at nebulon.de>
- * 2008 Mike Massonnet <mmassonnet 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Library General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef TYPES_H
-#define TYPES_H
-
-#include <gtk/gtk.h>
-
-#define REFRESH_INTERVAL 1000
-
-struct task
-{
- gint pid;
- gint ppid;
- gint uid;
- gchar uname[64];
- gchar name[64];
- gchar fullname[255];
- gchar state[16];
- gint vsize;
- gint rss;
- gboolean checked;
- gint time;
- gint old_time;
- gdouble time_percentage;
- gdouble old_time_percentage;
- gint prio; /* my change */
-};
-
-typedef struct
-{
- guint mem_total;
- guint mem_free;
- guint mem_cached;
- guint mem_buffers;
- guint cpu_count;
- guint cpu_idle;
- guint cpu_user;
- guint cpu_nice;
- guint cpu_system;
- guint cpu_old_jiffies;
- guint cpu_old_used;
- gboolean valid_proc_reading;
-} system_status;
-
-GtkWidget *main_window;
-
-GArray *task_array;
-gint tasks;
-gint own_uid;
-
-gchar *config_file;
-
-gboolean show_user_tasks;
-gboolean show_root_tasks;
-gboolean show_other_tasks;
-
-gboolean show_cached_as_free; /* Show memory used Cache as free memory */
-
-guint sort_column;
-guint sort_type;
-
-enum
-{
- COLUMN_NAME = 0,
- COLUMN_PID,
- COLUMN_PPID,
- COLUMN_STATE,
- COLUMN_MEM,
- COLUMN_RSS,
- COLUMN_UNAME,
- COLUMN_TIME,
- COLUMN_PRIO,
- N_COLUMNS,
-};
-
-gboolean show_col[N_COLUMNS];
-
-guint win_width;
-guint win_height;
-
-const gchar *custom_signal_0;
-const gchar *custom_signal_1;
-
-#endif
More information about the Xfce4-commits
mailing list