tracker r1843 - in branches/indexer-split: . src/tracker-indexer



Author: mr
Date: Thu Jul  3 10:55:20 2008
New Revision: 1843
URL: http://svn.gnome.org/viewvc/tracker?rev=1843&view=rev

Log:
	* src/tracker-indexer/tracker-indexer.c: Added throttling support.


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/tracker-indexer/tracker-indexer.c

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer.c	Thu Jul  3 10:55:20 2008
@@ -44,6 +44,8 @@
  *       everything just pushed in the files queue.
  */
 
+#include "config.h"
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -53,6 +55,7 @@
 #include <libtracker-common/tracker-config.h>
 #include <libtracker-common/tracker-dbus.h>
 #include <libtracker-common/tracker-file-utils.h>
+#include <libtracker-common/tracker-hal.h>
 #include <libtracker-common/tracker-language.h>
 #include <libtracker-common/tracker-parser.h>
 #include <libtracker-common/tracker-ontology.h>
@@ -70,10 +73,14 @@
 #define TRACKER_INDEXER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_INDEXER, TrackerIndexerPrivate))
 
 /* Flush every 'x' seconds */
-#define FLUSH_FREQUENCY 10
+#define FLUSH_FREQUENCY             10
 
 /* Transaction every 'x' items */
-#define TRANSACTION_MAX 50
+#define TRANSACTION_MAX             50
+
+/* Throttle defaults */
+#define THROTTLE_DEFAULT            0
+#define THROTTLE_DEFAULT_ON_BATTERY 5
 
 typedef struct TrackerIndexerPrivate TrackerIndexerPrivate;
 typedef struct PathInfo PathInfo;
@@ -99,8 +106,12 @@
 	TrackerConfig *config;
 	TrackerLanguage *language;
 
+#ifdef HAVE_HAL 
+	TrackerHal *hal;
+#endif /* HAVE_HAL */
+
 	GTimer *timer;
-	guint   items_indexed;
+	guint items_indexed;
 
 	guint idle_id;
 	guint flush_id;
@@ -231,6 +242,62 @@
 }
 
 static void
+set_up_throttle (TrackerIndexer *indexer)
+{
+#ifdef HAVE_HAL
+	TrackerIndexerPrivate *priv;
+	gint throttle;
+
+	priv = TRACKER_INDEXER_GET_PRIVATE (indexer);
+
+	/* If on a laptop battery and the throttling is default (i.e.
+	 * 0), then set the throttle to be higher so we don't kill
+	 * the laptop battery.
+	 */
+	throttle = tracker_config_get_throttle (priv->config);
+
+	if (tracker_hal_get_battery_in_use (priv->hal)) {
+		g_message ("We are running on battery");
+		
+		if (throttle == THROTTLE_DEFAULT) {
+			tracker_config_set_throttle (priv->config, 
+						     THROTTLE_DEFAULT_ON_BATTERY);
+			g_message ("Setting throttle from %d to %d", 
+				   throttle, 
+				   THROTTLE_DEFAULT_ON_BATTERY);
+		} else {
+			g_message ("Not setting throttle, it is currently set to %d",
+				   throttle);
+		}
+	} else {
+		g_message ("We are not running on battery");
+
+		if (throttle == THROTTLE_DEFAULT_ON_BATTERY) {
+			tracker_config_set_throttle (priv->config, 
+						     THROTTLE_DEFAULT_ON_BATTERY);
+			g_message ("Setting throttle from %d to %d", 
+				   throttle, 
+				   THROTTLE_DEFAULT_ON_BATTERY);
+		} else {
+			g_message ("Not setting throttle, it is currently set to %d", 
+				   throttle);
+		}
+	}
+#else  /* HAVE_HAL */
+	g_message ("HAL is not available to know if we are using a battery or not.");
+	g_message ("Not setting the throttle");
+#endif /* HAVE_HAL */
+}
+
+static void
+notify_battery_in_use_cb (GObject *gobject,
+			  GParamSpec *arg1,
+			  gpointer user_data) 
+{
+	set_up_throttle (TRACKER_INDEXER (user_data));
+}
+
+static void
 tracker_indexer_finalize (GObject *object)
 {
 	TrackerIndexerPrivate *priv;
@@ -263,6 +330,14 @@
 
 	g_hash_table_destroy (priv->indexer_modules);
 
+#ifdef HAVE_HAL
+	g_signal_handlers_disconnect_by_func (priv->hal, 
+					      notify_battery_in_use_cb,
+					      TRACKER_INDEXER (object));
+	
+	g_object_unref (priv->hal);
+#endif /* HAVE_HAL */
+
 	g_object_unref (priv->config);
 	g_object_unref (priv->language);
 
@@ -376,6 +451,17 @@
 	priv->file_process_queue = g_queue_new ();
 	priv->modules_queue = g_queue_new ();
 	priv->config = tracker_config_new ();
+
+#ifdef HAVE_HAL 
+	priv->hal = tracker_hal_new ();
+
+	g_signal_connect (priv->hal, "notify::battery-in-use",
+			  G_CALLBACK (notify_battery_in_use_cb),
+			  indexer);
+
+	set_up_throttle (indexer);
+#endif /* HAVE_HAL */
+
 	priv->language = tracker_language_new (priv->config);
 
 	priv->db_dir = g_build_filename (g_get_user_cache_dir (),
@@ -458,6 +544,25 @@
 }
 
 static void
+indexer_throttle (TrackerConfig *config,
+		  gint           multiplier)
+{
+        gint throttle;
+
+        throttle = tracker_config_get_throttle (config);
+
+        if (throttle < 1) {
+                return;
+        }
+
+        throttle *= multiplier;
+
+        if (throttle > 0) {
+                g_usleep (throttle);
+        }
+}
+
+static void
 index_metadata_foreach (gpointer key,
 			gpointer value,
 			gpointer user_data)
@@ -466,12 +571,20 @@
 	MetadataForeachData *data;
 	gchar *parsed_value;
 	gchar **arr;
+	gint throttle;
 	gint i;
 
 	if (!value) {
 		return;
 	}
 
+	/* Throttle indexer, value 9 is from older code, why 9? */
+	throttle = tracker_config_get_throttle (data->config);
+	if (throttle > 9) {
+		indexer_throttle (data->config, throttle * 100);
+	}
+
+	/* Parse */
 	field = tracker_ontology_get_field_def ((gchar *) key);
 
 	data = (MetadataForeachData *) user_data;
@@ -523,25 +636,28 @@
 	}
 }
 
-
 static gboolean
 process_file (TrackerIndexer *indexer,
 	      PathInfo       *info)
 {
+	TrackerIndexerPrivate *priv;
 	GHashTable *metadata;
 
 	g_message ("Processing file:'%s'", info->file->path);
 
+	priv = TRACKER_INDEXER_GET_PRIVATE (indexer);
+
+	/* Sleep to throttle back indexing */
+	indexer_throttle (priv->config, 100);
+
+	/* Process file */
 	metadata = tracker_indexer_module_file_get_metadata (info->module, info->file);
 
 	if (metadata) {
 		TrackerService *service;
-		TrackerIndexerPrivate *priv;
 		const gchar *service_type;
 		guint32 id;
 
-		priv = TRACKER_INDEXER_GET_PRIVATE (indexer);
-
 		service_type = tracker_indexer_module_get_name (info->module);
 		service = tracker_ontology_get_service_type_by_name (service_type);
 		id = tracker_db_get_new_service_id (priv->common);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]