The code already called stat directly in one place. By moving this code
further up we avoid doing a stat with g_file_test twice by replacing the g_file_test calls with similar code that uses the cached stat. Signed-off-by: Simon Holm Thøgersen <[hidden email]> --- gst/gstregistry.c | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diff --git a/gst/gstregistry.c b/gst/gstregistry.c index 1c1d27a..6850b91 100644 --- a/gst/gstregistry.c +++ b/gst/gstregistry.c @@ -808,9 +808,17 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, return FALSE; while ((dirent = g_dir_read_name (dir))) { + struct stat file_status; + filename = g_strjoin ("/", path, dirent, NULL); + if (stat(filename, &file_status) < 0) { + /* Plugin will be removed from cache after the scan completes if it + * is still marked 'cached' */ + g_free (filename); + continue; + } - if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { + if (S_ISDIR(file_status.st_mode)) { /* skip the .debug directory, these contain elf files that are not * useful or worse, can crash dlopen () */ if (g_str_equal (dirent, ".debug")) { @@ -831,7 +839,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, g_free (filename); continue; } - if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { + if (!S_ISREG(file_status.st_mode)) { GST_LOG_OBJECT (registry, "%s is not a regular file, ignoring", filename); g_free (filename); continue; @@ -853,15 +861,6 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, * was already seen by the registry, we ignore it */ plugin = gst_registry_lookup (registry, filename); if (plugin) { - struct stat file_status; - - if (stat (filename, &file_status)) { - /* Plugin will be removed from cache after the scan completes if it - * is still marked 'cached' */ - g_free (filename); - gst_object_unref (plugin); - continue; - } if (plugin->registered) { GST_DEBUG_OBJECT (registry, "plugin already registered from path \"%s\"", -- 1.6.0.2.526.g5c283 ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/gstreamer-devel |
Hi Simon,
This looks like a good idea. I think it'll need some more work to remain portable to Windows. I don't think the S_ISDIR and S_ISREG macros exist there. J. On Fri, 2008-11-07 at 21:42 +0100, Simon Holm Thøgersen wrote: > The code already called stat directly in one place. By moving this code > further up we avoid doing a stat with g_file_test twice by replacing the > g_file_test calls with similar code that uses the cached stat. > > Signed-off-by: Simon Holm Thøgersen <[hidden email]> > --- > gst/gstregistry.c | 21 ++++++++++----------- > 1 files changed, 10 insertions(+), 11 deletions(-) > > diff --git a/gst/gstregistry.c b/gst/gstregistry.c > index 1c1d27a..6850b91 100644 > --- a/gst/gstregistry.c > +++ b/gst/gstregistry.c > @@ -808,9 +808,17 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > return FALSE; > > while ((dirent = g_dir_read_name (dir))) { > + struct stat file_status; > + > filename = g_strjoin ("/", path, dirent, NULL); > + if (stat(filename, &file_status) < 0) { > + /* Plugin will be removed from cache after the scan completes if it > + * is still marked 'cached' */ > + g_free (filename); > + continue; > + } > > - if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { > + if (S_ISDIR(file_status.st_mode)) { > /* skip the .debug directory, these contain elf files that are not > * useful or worse, can crash dlopen () */ > if (g_str_equal (dirent, ".debug")) { > @@ -831,7 +839,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > g_free (filename); > continue; > } > - if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { > + if (!S_ISREG(file_status.st_mode)) { > GST_LOG_OBJECT (registry, "%s is not a regular file, ignoring", filename); > g_free (filename); > continue; > @@ -853,15 +861,6 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > * was already seen by the registry, we ignore it */ > plugin = gst_registry_lookup (registry, filename); > if (plugin) { > - struct stat file_status; > - > - if (stat (filename, &file_status)) { > - /* Plugin will be removed from cache after the scan completes if it > - * is still marked 'cached' */ > - g_free (filename); > - gst_object_unref (plugin); > - continue; > - } > if (plugin->registered) { > GST_DEBUG_OBJECT (registry, > "plugin already registered from path \"%s\"", Jan Schmidt <[hidden email]> ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/gstreamer-devel |
Administrator
|
Hi Simon,
Just tried the patch on linux. Seems to work fine. One remark though, we don't track patches on the mailing-list, could you open a bug on the gstreamer bugtracker so we can properly track this ? Edward On Sat, 2008-11-08 at 19:02 +0000, Jan Schmidt wrote: > Hi Simon, > > This looks like a good idea. I think it'll need some more work to remain > portable to Windows. I don't think the S_ISDIR and S_ISREG macros exist > there. > > J. > > On Fri, 2008-11-07 at 21:42 +0100, Simon Holm Thøgersen wrote: > > The code already called stat directly in one place. By moving this code > > further up we avoid doing a stat with g_file_test twice by replacing the > > g_file_test calls with similar code that uses the cached stat. > > > > Signed-off-by: Simon Holm Thøgersen <[hidden email]> > > --- > > gst/gstregistry.c | 21 ++++++++++----------- > > 1 files changed, 10 insertions(+), 11 deletions(-) > > > > diff --git a/gst/gstregistry.c b/gst/gstregistry.c > > index 1c1d27a..6850b91 100644 > > --- a/gst/gstregistry.c > > +++ b/gst/gstregistry.c > > @@ -808,9 +808,17 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > > return FALSE; > > > > while ((dirent = g_dir_read_name (dir))) { > > + struct stat file_status; > > + > > filename = g_strjoin ("/", path, dirent, NULL); > > + if (stat(filename, &file_status) < 0) { > > + /* Plugin will be removed from cache after the scan completes if it > > + * is still marked 'cached' */ > > + g_free (filename); > > + continue; > > + } > > > > - if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { > > + if (S_ISDIR(file_status.st_mode)) { > > /* skip the .debug directory, these contain elf files that are not > > * useful or worse, can crash dlopen () */ > > if (g_str_equal (dirent, ".debug")) { > > @@ -831,7 +839,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > > g_free (filename); > > continue; > > } > > - if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { > > + if (!S_ISREG(file_status.st_mode)) { > > GST_LOG_OBJECT (registry, "%s is not a regular file, ignoring", filename); > > g_free (filename); > > continue; > > @@ -853,15 +861,6 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, > > * was already seen by the registry, we ignore it */ > > plugin = gst_registry_lookup (registry, filename); > > if (plugin) { > > - struct stat file_status; > > - > > - if (stat (filename, &file_status)) { > > - /* Plugin will be removed from cache after the scan completes if it > > - * is still marked 'cached' */ > > - g_free (filename); > > - gst_object_unref (plugin); > > - continue; > > - } > > if (plugin->registered) { > > GST_DEBUG_OBJECT (registry, > > "plugin already registered from path \"%s\"", ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |