[Xfce4-commits] <xfce4-diskperf-plugin:master> Add support for Solaris, from Peter Tribble (#7167)

Landry Breuil noreply at xfce.org
Tue Apr 3 16:36:07 CEST 2012


Updating branch refs/heads/master
         to bd930384e6a5cbdd3f34ea639e2b5d7a1109bae4 (commit)
       from bbaa78380268c5113a61745664d2b012ae353ecd (commit)

commit bd930384e6a5cbdd3f34ea639e2b5d7a1109bae4
Author: Landry Breuil <landry at xfce.org>
Date:   Tue Apr 3 15:26:57 2012 +0200

    Add support for Solaris, from Peter Tribble (#7167)

 panel-plugin/devperf.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++-
 panel-plugin/main.c    |   32 +++++++++++++++--------
 2 files changed, 88 insertions(+), 12 deletions(-)

diff --git a/panel-plugin/devperf.c b/panel-plugin/devperf.c
index 97b45f5..4f7bbf2 100644
--- a/panel-plugin/devperf.c
+++ b/panel-plugin/devperf.c
@@ -1,5 +1,6 @@
 /* Copyright (c) 2003 RogerSeguin <roger_seguin at msn.com>
  * Copyright (c) 2003 Benedikt Meurer <benedikt.meurer at unix-ag.uni-siegen.de>
+ * Copyright (c) 2011 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
@@ -380,9 +381,74 @@ int DevGetPerfData (const void *p_pvDevice, struct devperf_t *perf)
 	return (0);
 }
 
+#elif defined (__sun__)
+/*
+ * Solaris (and OpenSolaris derivatives) support via kstat
+ * Peter Tribble <peter.tribble at gmail.com>
+ */
+#include <kstat.h>
+static kstat_ctl_t *kc;
+
+int DevPerfInit ()
+{
+	kc = kstat_open ();
+        return (0);
+}
+
+int DevCheckStatAvailability(char const **strptr)
+{
+        return (0);
+}
+
+int DevGetPerfData (const void *p_pvDevice, struct devperf_t *perf)
+{
+	kstat_t *ksp;
+	kstat_io_t *kiot;
+	char *devname = (char *)p_pvDevice;
+
+	if(!kc)
+		DevPerfInit();
+
+	/*
+	 * Use the device name. This is something like "sd3", after the
+	 * module and instance. The user is expected to work out the
+	 * possible device names. The command "iostat -x" is one way to
+	 * enumerate them. It would be really neat to have a way to present
+	 * this list to the user and get them to pick the one they want.
+	 */
+	if(!(ksp = kstat_lookup (kc, NULL, -1, devname))) {
+		return (-1);
+	}
+	if (kstat_read(kc, ksp, 0) == -1) {
+		return (-1);
+	}
+	/*
+	 * Just in case we accidentally matched something that wasn't
+	 * an I/O device.
+	 */
+	if (ksp->ks_type != KSTAT_TYPE_IO) {
+		return (-1);
+	}
+	kiot = KSTAT_IO_PTR(ksp);
+	perf->timestamp_ns = (uint64_t)ksp->ks_snaptime;
+	perf->rbytes = (uint64_t)kiot->nread;
+	perf->wbytes = (uint64_t)kiot->nwritten;
+	/*
+	 * Solaris keeps separate wait and run queues, but they aren't
+	 * separated by read and write. So allocate half to each.
+	 */
+	perf->wbusy_ns = (uint64_t) (kiot->wtime + kiot->rtime) / 2ull;
+	perf->rbusy_ns = perf->wbusy_ns;
+	/*
+	 * qlen isn't used, so set it to zero rather than calculate it.
+	 */
+	perf->qlen = 0;
+	return (0);
+}
+
 #else
 	/**************************************************************/
 	/********************	Unsupported platform	***************/
 	/**************************************************************/
-#error "Your plattform is not yet supported"
+#error "Your platform is not yet supported"
 #endif
diff --git a/panel-plugin/main.c b/panel-plugin/main.c
index 7ff3126..2a38c1c 100644
--- a/panel-plugin/main.c
+++ b/panel-plugin/main.c
@@ -53,6 +53,8 @@
     data, but only a single value combining both */
 #if  defined(__NetBSD__)
 #define	SEPARATE_BUSY_TIMES	0
+#elif  defined(__sun__)
+#define	SEPARATE_BUSY_TIMES	0
 #elif defined(__linux__)
 #define	SEPARATE_BUSY_TIMES	1
 #else
@@ -84,7 +86,7 @@ typedef enum monitor_bar_order_t {
 typedef struct param_t {
     /* Configurable parameters */
     char            acDevice[64];
-#if  !defined(__NetBSD__) && !defined(__OpenBSD__)
+#if  !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__sun__)
     dev_t           st_rdev;
 #endif
     int             fTitleDisplayed;
@@ -164,7 +166,7 @@ static int DisplayPerf (struct diskperf_t *p_poPlugin)
     rbytes = wbytes = iRBusy_ns = iWBusy_ns = -1;
     memset (&oPerf, 0, sizeof (oPerf));
     oPerf.qlen = -1;
-#if defined (__NetBSD__) || defined(__OpenBSD__)
+#if defined (__NetBSD__) || defined(__OpenBSD__) || defined(__sun__)
     status = DevGetPerfData (poConf->acDevice, &oPerf);
 #else
     status = DevGetPerfData (&(poConf->st_rdev), &oPerf);
@@ -211,18 +213,22 @@ static int DisplayPerf (struct diskperf_t *p_poPlugin)
 	     "  Write :%3.2f\n"
 	     "  Total :%3.2f\n"
 	     "Busy time (%c)\n"
+#if SEPARATE_BUSY_TIMES
 	     "  Read : %3d\n"
 	     "  Write : %3d\n"
+#endif
 	     "  Total : %3d",
 	     poConf->acTitle,
 	     arPerf[R_DATA],
 	     arPerf[W_DATA],
 	     arPerf[RW_DATA],
 	     '%',
-	     SEPARATE_BUSY_TIMES && (oPerf.qlen >= 0) ?
+#if SEPARATE_BUSY_TIMES
+	     (oPerf.qlen >= 0) ?
 	     (int) round(arBusy[R_DATA]) : -1,
-	     SEPARATE_BUSY_TIMES && (oPerf.qlen >= 0) ?
+	     (oPerf.qlen >= 0) ?
 	     (int) round(arBusy[W_DATA]) : -1,
+#endif
 	     (oPerf.qlen >= 0) ? (int) round(arBusy[RW_DATA]) : -1);
     gtk_tooltips_set_tip (s_poToolTips, GTK_WIDGET (poMonitor->wEventBox),
 			  acToolTips, 0);
@@ -406,7 +412,7 @@ static diskperf_t *diskperf_create_control (XfcePanelPlugin *plugin)
     struct diskperf_t *poPlugin;
     struct param_t *poConf;
     struct monitor_t *poMonitor;
-#if !defined(__NetBSD__) && !defined(__OpenBSD__)
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__sun__)
     struct stat     oStat;
     int             status;
 #endif
@@ -421,6 +427,9 @@ static diskperf_t *diskperf_create_control (XfcePanelPlugin *plugin)
 #if defined(__NetBSD__) || defined(__OpenBSD__)
     strncpy (poConf->acDevice, "wd0", 64);
     strncpy (poConf->acTitle, "wd0", 16);
+#elif defined(__sun__)
+    strncpy (poConf->acDevice, "sd0", 64);
+    strncpy (poConf->acTitle, "sd0", 16);
 #else
     strncpy (poConf->acDevice, "/dev/sda", 64);
     status = stat (poConf->acDevice, &oStat);
@@ -489,7 +498,7 @@ static void diskperf_read_config (XfcePanelPlugin *plugin,
     struct param_t *poConf = &(poPlugin->oConf.oParam);
     struct monitor_t *poMonitor = &(poPlugin->oMonitor);
     Widget_t       *pw2ndBar = poPlugin->oMonitor.awProgressBar + 1;
-#if !defined(__NetBSD__) && !defined(__OpenBSD__)
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__sun__)
     struct stat     oStat;
     int             status;
 #endif
@@ -506,7 +515,7 @@ static void diskperf_read_config (XfcePanelPlugin *plugin,
     if ((value = xfce_rc_read_entry (rc, (CONF_DEVICE), NULL))) {
         memset (poConf->acDevice, 0, sizeof (poConf->acDevice));
         strncpy (poConf->acDevice, value, sizeof (poConf->acDevice) - 1);
-#if !defined(__NetBSD__) && !defined(__OpenBSD__)
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__sun__)
         status = stat (poConf->acDevice, &oStat);
         poConf->st_rdev = (status == -1 ? 0 : oStat.st_rdev);
 #endif
@@ -630,7 +639,7 @@ static void SetDevice (Widget_t p_wTF, void *p_pvPlugin)
     struct diskperf_t *poPlugin = (diskperf_t *) p_pvPlugin;
     struct param_t *poConf = &(poPlugin->oConf.oParam);
     const char     *pcDevice = gtk_entry_get_text (GTK_ENTRY (p_wTF));
-#if !defined(__NetBSD__) && !defined(__OpenBSD__)
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__sun__)
     struct stat     oStat;
     int             status;
 
@@ -893,11 +902,12 @@ static void About (Widget_t w, void *unused)
 {
     xfce_dialog_show_info (NULL, NULL, 
                _("%s %s - Disk Performance Monitor\n"
-	       "Display instantaneous disk I/O transfer rates and busy times "
-	       "on Linux and NetBSD systems\n\n"
+	       "Display instantaneous disk I/O transfer rates and busy times \n\n"
 	       "(c) 2003, 2004 Roger Seguin <roger_seguin at msn.com>\n"
 	       "NetBSD statistics collection: (c) 2003 Benedikt Meurer\n"
-	       "\t<benedikt.meurer at unix-ag.uni-siegen.de>"),
+	       "\t<benedikt.meurer at unix-ag.uni-siegen.de>\n"
+! 	       "Solaris statistics collection: (c) 2011 Peter Tribble\n"
+! 	       "\t<peter.tribble at gmail.com>"),
 	       PACKAGE, VERSION);
 }				/* About() */
 


More information about the Xfce4-commits mailing list