summaryrefslogtreecommitdiffstats
path: root/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c')
-rw-r--r--devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c b/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c
new file mode 100644
index 000000000..85c9822f8
--- /dev/null
+++ b/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c
@@ -0,0 +1,134 @@
+--- sysdeps/freebsd/jfsusage.c.orig Sun Apr 9 12:52:45 2006
++++ sysdeps/freebsd/fsusage.c Mon Apr 10 15:34:42 2006
+@@ -9,10 +9,12 @@
+
+ #include <unistd.h>
+ #include <sys/param.h>
+-#if defined (HAVE_SYS_STATVFS_H)
+-#include <sys/statvfs.h>
+-#else
+ #include <sys/mount.h>
++#if __FreeBSD_version >= 600000
++#include <libgeom.h>
++#include <sys/resource.h>
++#include <devstat.h>
++#include <sys/devicestat.h>
+ #endif
+
+ #include <stdio.h>
+@@ -31,24 +33,108 @@ _glibtop_freebsd_get_fsusage_read_write(
+ const char *path)
+ {
+ int result;
+-#if defined (STAT_STATVFS)
+- struct statvfs sfs;
+-#else
+ struct statfs sfs;
++#if __FreeBSD_version >= 600000
++ struct devstat *ds;
++ void *sc;
++ struct timespec ts;
++ struct gprovider *gp;
++ struct gident *gid;
++ struct gmesh gmp;
++ double etime;
++ uint64_t ld[2];
+ #endif
+
+-#if defined (STAT_STATVFS)
+- result = statvfs (path, &sfs);
+-#else
+ result = statfs (path, &sfs);
+-#endif
+
+ if (result == -1) {
++ glibtop_warn_io_r (server, "statfs");
++ return;
++ }
++#if __FreeBSD_version >= 600000
++ ld[0] = 0;
++ ld[1] = 0;
++ result = geom_gettree (&gmp);
++ if (result != 0) {
++ glibtop_warn_io_r (server, "geom_gettree = %d", result);
++ return;
++ }
++
++ result = geom_stats_open ();
++ if (result) {
++ glibtop_warn_io_r (server, "geom_stats_open()");
++ geom_deletetree (&gmp);
++ return;
++ }
++
++ sc = geom_stats_snapshot_get ();
++ if (sc == NULL) {
++ glibtop_warn_io_r (server, "geom_stats_snapshot_get()");
++ geom_stats_close ();
++ geom_deletetree (&gmp);
+ return;
+ }
+
++ geom_stats_snapshot_timestamp (sc, &ts);
++ etime = ts.tv_sec + (ts.tv_nsec * 1e-9);
++ geom_stats_snapshot_reset (sc);
++
++ for (;;) {
++ ds = geom_stats_snapshot_next (sc);
++ if (ds == NULL) {
++ break;
++ }
++ if (ds->id == NULL) {
++ continue;
++ }
++
++ gid = geom_lookupid (&gmp, ds->id);
++ if (gid == NULL) {
++ geom_deletetree (&gmp);
++ result = geom_gettree (&gmp);
++ gid = geom_lookupid (&gmp, ds->id);
++ }
++
++ if (gid == NULL) {
++ continue;
++ }
++ if (gid->lg_what == ISCONSUMER) {
++ continue;
++ }
++
++ gp = gid->lg_ptr;
++
++ if (!g_str_has_suffix (sfs.f_mntfromname, gp->lg_name)) {
++ continue;
++ }
++ else {
++ result = devstat_compute_statistics (ds, NULL, etime,
++ DSM_TOTAL_TRANSFERS_READ,
++ &ld[0],
++ DSM_TOTAL_TRANSFERS_WRITE,
++ &ld[1], DSM_NONE);
++ if (result != 0) {
++ glibtop_warn_io_r (server,
++ "devstat_compute_statistics()");
++ geom_stats_snapshot_free (sc);
++ geom_stats_close ();
++ geom_deletetree (&gmp);
++ return;
++ }
++ break;
++ }
++ }
++
++ geom_stats_snapshot_free (sc);
++ geom_stats_close ();
++ geom_deletetree (&gmp);
++
++ buf->read = ld[0];
++ buf->write = ld[1];
++#else
+ buf->read = sfs.f_syncreads + sfs.f_asyncreads;
+ buf->write = sfs.f_syncwrites + sfs.f_asyncwrites;
++#endif
+
+ buf->flags |= (1 << GLIBTOP_FSUSAGE_READ) | (1 << GLIBTOP_FSUSAGE_WRITE);
+ }