[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