[tracker-miners/wip/carlosg/speed-track: 23/40] libtracker-miner: Avoid signals for TrackerCrawler file check functions
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker-miners/wip/carlosg/speed-track: 23/40] libtracker-miner: Avoid signals for TrackerCrawler file check functions
- Date: Sun, 18 Oct 2020 20:58:43 +0000 (UTC)
commit 6bfa5c9f42bed69bc54db50b6d6ca3a73ef277f6
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Oct 14 21:14:41 2020 +0200
libtracker-miner: Avoid signals for TrackerCrawler file check functions
Make file/directory checks through a func given through a setter, in order
to avoid signal emission overhead. This saves a bit of time as we emit up
to 2 signals per file.
src/libtracker-miner/tracker-crawler.c | 108 +++++++++++---------------
src/libtracker-miner/tracker-crawler.h | 24 ++++--
src/libtracker-miner/tracker-file-notifier.c | 64 +++++++++------
tests/libtracker-miner/tracker-crawler-test.c | 47 +++--------
4 files changed, 115 insertions(+), 128 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-crawler.c b/src/libtracker-miner/tracker-crawler.c
index 8b038581e..6b09e2c75 100644
--- a/src/libtracker-miner/tracker-crawler.c
+++ b/src/libtracker-miner/tracker-crawler.c
@@ -95,6 +95,11 @@ struct TrackerCrawlerPrivate {
gchar *file_attributes;
+ /* Check func */
+ TrackerCrawlerCheckFunc check_func;
+ gpointer check_func_data;
+ GDestroyNotify check_func_destroy;
+
/* Status */
gboolean is_running;
gboolean is_finished;
@@ -102,9 +107,6 @@ struct TrackerCrawlerPrivate {
};
enum {
- CHECK_DIRECTORY,
- CHECK_FILE,
- CHECK_DIRECTORY_CONTENTS,
DIRECTORY_CRAWLED,
FINISHED,
LAST_SIGNAL
@@ -124,11 +126,6 @@ static void crawler_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec);
static void crawler_finalize (GObject *object);
-static gboolean check_defaults (TrackerCrawler *crawler,
- GFile *file);
-static gboolean check_contents_defaults (TrackerCrawler *crawler,
- GFile *file,
- GList *contents);
static void data_provider_data_free (DataProviderData *dpd);
static void data_provider_begin (TrackerCrawler *crawler,
@@ -148,48 +145,11 @@ static void
tracker_crawler_class_init (TrackerCrawlerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- TrackerCrawlerClass *crawler_class = TRACKER_CRAWLER_CLASS (klass);
object_class->set_property = crawler_set_property;
object_class->get_property = crawler_get_property;
object_class->finalize = crawler_finalize;
- crawler_class->check_directory = check_defaults;
- crawler_class->check_file = check_defaults;
- crawler_class->check_directory_contents = check_contents_defaults;
-
- signals[CHECK_DIRECTORY] =
- g_signal_new ("check-directory",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TrackerCrawlerClass, check_directory),
- tracker_accumulator_check_file,
- NULL,
- NULL,
- G_TYPE_BOOLEAN,
- 1,
- G_TYPE_FILE);
- signals[CHECK_FILE] =
- g_signal_new ("check-file",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TrackerCrawlerClass, check_file),
- tracker_accumulator_check_file,
- NULL,
- NULL,
- G_TYPE_BOOLEAN,
- 1,
- G_TYPE_FILE);
- signals[CHECK_DIRECTORY_CONTENTS] =
- g_signal_new ("check-directory-contents",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TrackerCrawlerClass, check_directory_contents),
- tracker_accumulator_check_file,
- NULL,
- NULL,
- G_TYPE_BOOLEAN,
- 2, G_TYPE_FILE, G_TYPE_POINTER);
signals[DIRECTORY_CRAWLED] =
g_signal_new ("directory-crawled",
G_TYPE_FROM_CLASS (klass),
@@ -284,6 +244,10 @@ crawler_finalize (GObject *object)
priv = tracker_crawler_get_instance_private (TRACKER_CRAWLER (object));
+ if (priv->check_func_data && priv->check_func_destroy) {
+ priv->check_func_destroy (priv->check_func_data);
+ }
+
if (priv->idle_id) {
g_source_remove (priv->idle_id);
}
@@ -305,21 +269,6 @@ crawler_finalize (GObject *object)
G_OBJECT_CLASS (tracker_crawler_parent_class)->finalize (object);
}
-static gboolean
-check_defaults (TrackerCrawler *crawler,
- GFile *file)
-{
- return TRUE;
-}
-
-static gboolean
-check_contents_defaults (TrackerCrawler *crawler,
- GFile *file,
- GList *contents)
-{
- return TRUE;
-}
-
TrackerCrawler *
tracker_crawler_new (TrackerDataProvider *data_provider)
{
@@ -348,6 +297,39 @@ tracker_crawler_new (TrackerDataProvider *data_provider)
return crawler;
}
+void
+tracker_crawler_set_check_func (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFunc func,
+ gpointer user_data,
+ GDestroyNotify destroy_notify)
+{
+ TrackerCrawlerPrivate *priv;
+
+ g_return_if_fail (TRACKER_IS_CRAWLER (crawler));
+
+ priv = tracker_crawler_get_instance_private (crawler);
+ priv->check_func = func;
+ priv->check_func_data = user_data;
+ priv->check_func_destroy = destroy_notify;
+}
+
+static gboolean
+invoke_check (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFlags flags,
+ GFile *file,
+ GList *children)
+{
+ TrackerCrawlerPrivate *priv;
+
+ priv = tracker_crawler_get_instance_private (crawler);
+
+ if (!priv->check_func)
+ return TRUE;
+
+ return priv->check_func (crawler, flags, file, children,
+ priv->check_func_data);
+}
+
static gboolean
check_file (TrackerCrawler *crawler,
DirectoryRootInfo *info,
@@ -358,7 +340,7 @@ check_file (TrackerCrawler *crawler,
priv = tracker_crawler_get_instance_private (crawler);
- g_signal_emit (crawler, signals[CHECK_FILE], 0, file, &use);
+ use = invoke_check (crawler, TRACKER_CRAWLER_CHECK_FILE, file, NULL);
/* Crawler may have been stopped while waiting for the 'use' value,
* and the DirectoryRootInfo already disposed... */
@@ -385,7 +367,7 @@ check_directory (TrackerCrawler *crawler,
priv = tracker_crawler_get_instance_private (crawler);
- g_signal_emit (crawler, signals[CHECK_DIRECTORY], 0, file, &use);
+ use = invoke_check (crawler, TRACKER_CRAWLER_CHECK_DIRECTORY, file, NULL);
/* Crawler may have been stopped while waiting for the 'use' value,
* and the DirectoryRootInfo already disposed... */
@@ -752,7 +734,7 @@ data_provider_data_process (DataProviderData *dpd)
children = g_list_prepend (children, child_data->child);
}
- g_signal_emit (crawler, signals[CHECK_DIRECTORY_CONTENTS], 0, dpd->dir_file, children, &use);
+ use = invoke_check (crawler, TRACKER_CRAWLER_CHECK_CONTENT, dpd->dir_file, children);
g_list_free (children);
if (!use) {
diff --git a/src/libtracker-miner/tracker-crawler.h b/src/libtracker-miner/tracker-crawler.h
index 7b187123e..985ecddca 100644
--- a/src/libtracker-miner/tracker-crawler.h
+++ b/src/libtracker-miner/tracker-crawler.h
@@ -45,6 +45,18 @@ typedef struct TrackerCrawler TrackerCrawler;
typedef struct TrackerCrawlerClass TrackerCrawlerClass;
typedef struct TrackerCrawlerPrivate TrackerCrawlerPrivate;
+typedef enum {
+ TRACKER_CRAWLER_CHECK_FILE = 1 << 0,
+ TRACKER_CRAWLER_CHECK_DIRECTORY = 1 << 1,
+ TRACKER_CRAWLER_CHECK_CONTENT = 1 << 2,
+} TrackerCrawlerCheckFlags;
+
+typedef gboolean (*TrackerCrawlerCheckFunc) (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFlags flags,
+ GFile *file,
+ const GList *children,
+ gpointer user_data);
+
struct TrackerCrawler {
GObject parent;
};
@@ -52,13 +64,6 @@ struct TrackerCrawler {
struct TrackerCrawlerClass {
GObjectClass parent;
- gboolean (* check_directory) (TrackerCrawler *crawler,
- GFile *file);
- gboolean (* check_file) (TrackerCrawler *crawler,
- GFile *file);
- gboolean (* check_directory_contents) (TrackerCrawler *crawler,
- GFile *file,
- GList *contents);
void (* directory_crawled) (TrackerCrawler *crawler,
GFile *directory,
GNode *tree,
@@ -84,6 +89,11 @@ const gchar * tracker_crawler_get_file_attributes (TrackerCrawler *crawler);
GFileInfo * tracker_crawler_get_file_info (TrackerCrawler *crawler,
GFile *file);
+void tracker_crawler_set_check_func (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFunc func,
+ gpointer user_data,
+ GDestroyNotify destroy_notify);
+
G_END_DECLS
#endif /* __LIBTRACKER_MINER_CRAWLER_H__ */
diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c
index a249e241e..e510c9bb2 100644
--- a/src/libtracker-miner/tracker-file-notifier.c
+++ b/src/libtracker-miner/tracker-file-notifier.c
@@ -196,13 +196,12 @@ root_data_free (RootData *data)
/* Crawler signal handlers */
static gboolean
-crawler_check_file_cb (TrackerCrawler *crawler,
- GFile *file,
- gpointer user_data)
+check_file (TrackerFileNotifier *notifier,
+ GFile *file)
{
TrackerFileNotifierPrivate *priv;
- priv = tracker_file_notifier_get_instance_private (user_data);
+ priv = tracker_file_notifier_get_instance_private (notifier);
return tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
file,
@@ -210,13 +209,12 @@ crawler_check_file_cb (TrackerCrawler *crawler,
}
static gboolean
-crawler_check_directory_cb (TrackerCrawler *crawler,
- GFile *directory,
- gpointer user_data)
+check_directory (TrackerFileNotifier *notifier,
+ GFile *directory)
{
TrackerFileNotifierPrivate *priv;
- priv = tracker_file_notifier_get_instance_private (user_data);
+ priv = tracker_file_notifier_get_instance_private (notifier);
g_assert (priv->current_index_root != NULL);
/* If it's a config root itself, other than the one
@@ -234,15 +232,14 @@ crawler_check_directory_cb (TrackerCrawler *crawler,
}
static gboolean
-crawler_check_directory_contents_cb (TrackerCrawler *crawler,
- GFile *parent,
- GList *children,
- gpointer user_data)
+check_directory_contents (TrackerFileNotifier *notifier,
+ GFile *parent,
+ const GList *children)
{
TrackerFileNotifierPrivate *priv;
gboolean process = TRUE;
- priv = tracker_file_notifier_get_instance_private (user_data);
+ priv = tracker_file_notifier_get_instance_private (notifier);
/* Do not let content filter apply to configured roots themselves. This
* is a measure to trim undesired portions of the filesystem, and if
@@ -250,7 +247,7 @@ crawler_check_directory_contents_cb (TrackerCrawler *crawler,
*/
if (!tracker_indexing_tree_file_is_root (priv->indexing_tree, parent)) {
process = tracker_indexing_tree_parent_is_indexable (priv->indexing_tree,
- parent, children);
+ parent, (GList*) children);
}
if (!process) {
@@ -1389,6 +1386,33 @@ check_disable_monitor (TrackerFileNotifier *notifier)
g_clear_object (&cursor);
}
+static gboolean
+crawler_check_func (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFlags flags,
+ GFile *file,
+ const GList *children,
+ gpointer user_data)
+{
+ TrackerFileNotifier *notifier = user_data;
+
+ if (flags & TRACKER_CRAWLER_CHECK_FILE) {
+ if (!check_file (notifier, file))
+ return FALSE;
+ }
+
+ if (flags & TRACKER_CRAWLER_CHECK_DIRECTORY) {
+ if (!check_directory (notifier, file))
+ return FALSE;
+ }
+
+ if (flags & TRACKER_CRAWLER_CHECK_CONTENT) {
+ if (!check_directory_contents (notifier, file, children))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
tracker_file_notifier_constructed (GObject *object)
{
@@ -1410,19 +1434,13 @@ tracker_file_notifier_constructed (GObject *object)
/* Set up crawler */
priv->crawler = tracker_crawler_new (priv->data_provider);
+ tracker_crawler_set_check_func (priv->crawler,
+ crawler_check_func,
+ object, NULL);
tracker_crawler_set_file_attributes (priv->crawler,
G_FILE_ATTRIBUTE_TIME_MODIFIED ","
G_FILE_ATTRIBUTE_STANDARD_TYPE);
- g_signal_connect (priv->crawler, "check-file",
- G_CALLBACK (crawler_check_file_cb),
- object);
- g_signal_connect (priv->crawler, "check-directory",
- G_CALLBACK (crawler_check_directory_cb),
- object);
- g_signal_connect (priv->crawler, "check-directory-contents",
- G_CALLBACK (crawler_check_directory_contents_cb),
- object);
g_signal_connect (priv->crawler, "directory-crawled",
G_CALLBACK (crawler_directory_crawled_cb),
object);
diff --git a/tests/libtracker-miner/tracker-crawler-test.c b/tests/libtracker-miner/tracker-crawler-test.c
index 8ad854786..ddf8ec650 100644
--- a/tests/libtracker-miner/tracker-crawler-test.c
+++ b/tests/libtracker-miner/tracker-crawler-test.c
@@ -74,38 +74,20 @@ crawler_directory_crawled_cb (TrackerCrawler *crawler,
}
static gboolean
-crawler_check_directory_cb (TrackerCrawler *crawler,
- GFile *file,
- gpointer user_data)
+check_func (TrackerCrawler *crawler,
+ TrackerCrawlerCheckFlags flags,
+ GFile *file,
+ const GList *children,
+ gpointer user_data)
{
CrawlerTest *test = user_data;
- test->n_check_directory++;
-
- return TRUE;
-}
-
-static gboolean
-crawler_check_file_cb (TrackerCrawler *crawler,
- GFile *file,
- gpointer user_data)
-{
- CrawlerTest *test = user_data;
-
- test->n_check_file++;
-
- return TRUE;
-}
-
-static gboolean
-crawler_check_directory_contents_cb (TrackerCrawler *crawler,
- GFile *file,
- GList *contents,
- gpointer user_data)
-{
- CrawlerTest *test = user_data;
-
- test->n_check_directory_contents++;
+ if (flags & TRACKER_CRAWLER_CHECK_FILE)
+ test->n_check_file++;
+ if (flags & TRACKER_CRAWLER_CHECK_DIRECTORY)
+ test->n_check_directory++;
+ if (flags & TRACKER_CRAWLER_CHECK_CONTENT)
+ test->n_check_directory_contents++;
return TRUE;
}
@@ -227,16 +209,11 @@ test_crawler_crawl_n_signals_non_recursive (void)
test.main_loop = g_main_loop_new (NULL, FALSE);
crawler = tracker_crawler_new (NULL);
+ tracker_crawler_set_check_func (crawler, check_func, &test, NULL);
g_signal_connect (crawler, "finished",
G_CALLBACK (crawler_finished_cb), &test);
g_signal_connect (crawler, "directory-crawled",
G_CALLBACK (crawler_directory_crawled_cb), &test);
- g_signal_connect (crawler, "check-directory",
- G_CALLBACK (crawler_check_directory_cb), &test);
- g_signal_connect (crawler, "check-directory-contents",
- G_CALLBACK (crawler_check_directory_contents_cb), &test);
- g_signal_connect (crawler, "check-file",
- G_CALLBACK (crawler_check_file_cb), &test);
file = g_file_new_for_path (TEST_DATA_DIR);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]