# HG changeset patch # User William Pitcock # Date 1241099671 18000 # Node ID 1e48d5a52760e04c5894dad339ea926286faee95 # Parent 3355beb9105b686cdb637d1506e4e29d3434bacc 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. diff -r 3355beb9105b -r 1e48d5a52760 src/vfstrace/Makefile --- /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} diff -r 3355beb9105b -r 1e48d5a52760 src/vfstrace/vfstrace.c --- /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 + +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); +