changeset 3097:1e48d5a52760

vfstrace: merge plugin vfstrace is useful for tracing vfs operations. you can compare logs to determine discrepancies between different VFS implementations. this is helpful for squashing bugs.
author William Pitcock <nenolod@atheme.org>
date Thu, 30 Apr 2009 08:54:31 -0500
parents 3355beb9105b
children cdf79f7b0d9e
files src/vfstrace/Makefile src/vfstrace/vfstrace.c
diffstat 2 files changed, 230 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/vfstrace/Makefile	Thu Apr 30 08:54:31 2009 -0500
@@ -0,0 +1,12 @@
+PLUGIN = vfstrace${PLUGIN_SUFFIX}
+
+SRCS = vfstrace.c
+
+include ../../buildsys.mk
+include ../../extra.mk
+
+plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
+
+CFLAGS += ${PLUGIN_CFLAGS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/vfstrace/vfstrace.c	Thu Apr 30 08:54:31 2009 -0500
@@ -0,0 +1,218 @@
+/*  Audacious
+ *  Copyright (c) 2009 William Pitcock
+ *
+ *  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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <audacious/plugin.h>
+
+VFSFile *(*vfs_fopen_impl)(const gchar *path, const gchar *mode) = NULL;
+gint (*vfs_fclose_impl)(VFSFile * file) = NULL;
+size_t (*vfs_fread_impl)(gpointer ptr, size_t size, size_t nmemb, VFSFile *file) = NULL;
+size_t (*vfs_fwrite_impl)(gconstpointer ptr, size_t size, size_t nmemb, VFSFile *file) = NULL;
+gint (*vfs_getc_impl)(VFSFile *stream) = NULL;
+gint (*vfs_ungetc_impl)(gint c, VFSFile *stream) = NULL;
+gint (*vfs_fseek_impl)(VFSFile *file, glong offset, gint whence) = NULL;
+void (*vfs_rewind_impl)(VFSFile *file) = NULL;
+glong (*vfs_ftell_impl)(VFSFile *file) = NULL;
+gboolean (*vfs_feof_impl)(VFSFile *file) = NULL;
+gboolean (*vfs_truncate_impl)(VFSFile *file, glong length) = NULL;
+off_t (*vfs_fsize_impl)(VFSFile *file) = NULL;
+
+VFSFile *
+vt_vfs_fopen_impl(const gchar *path, const gchar *mode)
+{
+    VFSFile *ret;
+
+    ret = vfs_fopen_impl(path, mode);
+    g_print("fopen       : path:%s : mode:%s : ret:%p\n", path, mode, ret);
+
+    return ret;
+}
+
+gint
+vt_vfs_fclose_impl(VFSFile *file)
+{
+    gint ret;
+
+    ret = vfs_fclose_impl(file);
+    g_print("fclose      : file:%p : ret:%d\n", file, ret);
+
+    return ret;
+}
+
+size_t
+vt_vfs_fread_impl(gpointer ptr, size_t size, size_t nmemb, VFSFile *file)
+{
+    size_t ret;
+
+    ret = vfs_fread_impl(ptr, size, nmemb, file);
+    g_print("fread       : size:%lu : nmemb:%lu : ret:%lu\n", size, nmemb, ret);
+
+    return ret;
+}
+
+size_t
+vt_vfs_fwrite_impl(gconstpointer ptr, size_t size, size_t nmemb, VFSFile *file)
+{
+    size_t ret;
+
+    ret = vfs_fwrite_impl(ptr, size, nmemb, file);
+    g_print("fwrite      : size:%lu : nmemb:%lu : ret:%lu\n", size, nmemb, ret);
+
+    return ret;
+}
+
+gint
+vt_vfs_getc_impl(VFSFile *stream)
+{
+    gint ret;
+
+    ret = vfs_getc_impl(stream);
+    g_print("getc        : ret:%d\n", ret);
+
+    return ret;
+}
+
+gint
+vt_vfs_ungetc_impl(gint c, VFSFile *stream)
+{
+    gint ret;
+
+    ret = vfs_ungetc_impl(c, stream);
+    g_print("ungetc      : c:%d : ret:%d\n", c, ret);
+
+    return ret;
+}
+
+gint
+vt_vfs_fseek_impl(VFSFile *file, glong offset, gint whence)
+{
+    gint ret;
+
+    ret = vfs_fseek_impl(file, offset, whence);
+    g_print("fseek       : offset:%ld : whence:%d : ret:%d\n", offset, whence, ret);
+
+    return ret;
+}
+
+void
+vt_vfs_rewind_impl(VFSFile *file)
+{
+    g_print("rewind\n");
+    vfs_rewind_impl(file);
+}
+
+glong
+vt_vfs_ftell_impl(VFSFile *file)
+{
+    glong ret;
+
+    ret = vfs_ftell_impl(file);
+    g_print("ftell       : ret:%ld\n", ret);
+
+    return ret;
+}
+
+gboolean
+vt_vfs_feof_impl(VFSFile *file)
+{
+    gboolean ret;
+
+    ret = vfs_feof_impl(file);
+    g_print("feof        : ret:%d\n", ret);
+
+    return ret;
+}
+
+gboolean
+vt_vfs_truncate_impl(VFSFile *file, glong length)
+{
+    gboolean ret;
+
+    ret = vfs_truncate_impl(file, length);
+    g_print("truncate    : length:%ld : ret:%d\n", length, ret);
+
+    return ret;
+}
+
+off_t
+vt_vfs_fsize_impl(VFSFile *file)
+{
+    off_t ret;
+
+    ret = vfs_fsize_impl(file);
+    g_print("fsize       : ret:%lu\n", ret);
+
+    return ret;
+}
+
+void
+patch_vfs(void)
+{
+    vfs_fopen_impl = aud_vfs_fopen;
+    vfs_fclose_impl = aud_vfs_fclose;
+    vfs_fread_impl = aud_vfs_fread;
+    vfs_fwrite_impl = aud_vfs_fwrite;
+    vfs_getc_impl = aud_vfs_getc;
+    vfs_ungetc_impl = aud_vfs_ungetc;
+    vfs_fseek_impl = aud_vfs_fseek;
+    vfs_rewind_impl = aud_vfs_rewind;
+    vfs_ftell_impl = aud_vfs_ftell;
+    vfs_feof_impl = aud_vfs_feof;
+    vfs_truncate_impl = aud_vfs_truncate;
+    vfs_fsize_impl = aud_vfs_fsize;
+
+    aud_vfs_fopen = vt_vfs_fopen_impl;
+    aud_vfs_fclose = vt_vfs_fclose_impl;
+    aud_vfs_fread = vt_vfs_fread_impl;
+    aud_vfs_fwrite = vt_vfs_fwrite_impl;
+    aud_vfs_getc = vt_vfs_getc_impl;
+    aud_vfs_ungetc = vt_vfs_ungetc_impl;
+    aud_vfs_fseek = vt_vfs_fseek_impl;
+    aud_vfs_rewind = vt_vfs_rewind_impl;
+    aud_vfs_ftell = vt_vfs_ftell_impl;
+    aud_vfs_feof = vt_vfs_feof_impl;
+    aud_vfs_truncate = vt_vfs_truncate_impl;
+    aud_vfs_fsize = vt_vfs_fsize_impl;
+}
+
+void
+unpatch_vfs(void)
+{
+    aud_vfs_fopen = vfs_fopen_impl;
+    aud_vfs_fclose = vfs_fclose_impl;
+    aud_vfs_fread = vfs_fread_impl;
+    aud_vfs_fwrite = vfs_fwrite_impl;
+    aud_vfs_getc = vfs_getc_impl;
+    aud_vfs_ungetc = vfs_ungetc_impl;
+    aud_vfs_fseek = vfs_fseek_impl;
+    aud_vfs_rewind = vfs_rewind_impl;
+    aud_vfs_ftell = vfs_ftell_impl;
+    aud_vfs_feof = vfs_feof_impl;
+    aud_vfs_truncate = vfs_truncate_impl;
+    aud_vfs_fsize = vfs_fsize_impl;
+}
+
+static GeneralPlugin vfstrace_plugin =
+{
+     .description = "VFSTrace",
+     .init = patch_vfs,
+     .cleanup = unpatch_vfs,
+};
+
+GeneralPlugin *vfstrace_gplist[] = { &vfstrace_plugin, NULL };
+SIMPLE_GENERAL_PLUGIN(vfstrace, vfstrace_gplist);
+