Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-09 18:14:24 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-07-09 18:14:24 (GMT)
commitecca1dca0011df7d40f424e89a75f0cc9193b874 (patch)
treeefdc5389300c609ba106ec0c45405d98af542405 /sugar
parent1ae7a908eab97bd3a8475feec20ce490c725a1b7 (diff)
Add caching to the activity and object type registries.
Diffstat (limited to 'sugar')
-rw-r--r--sugar/activity/registry.py28
-rw-r--r--sugar/objects/objecttype.py23
2 files changed, 47 insertions, 4 deletions
diff --git a/sugar/activity/registry.py b/sugar/activity/registry.py
index 171f740..b19abee 100644
--- a/sugar/activity/registry.py
+++ b/sugar/activity/registry.py
@@ -15,6 +15,8 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
+import logging
+
import dbus
_SHELL_SERVICE = "org.laptop.Shell"
@@ -39,6 +41,11 @@ class ActivityRegistry(object):
bus = dbus.SessionBus()
bus_object = bus.get_object(_SHELL_SERVICE, _SHELL_PATH)
self._registry = dbus.Interface(bus_object, _REGISTRY_IFACE)
+ self._registry.connect_to_signal('ActivityAdded', self._activity_added_cb)
+
+ # Two caches fo saving some travel across dbus.
+ self._service_name_to_activity_info = {}
+ self._mime_type_to_activities = {}
def _convert_info_list(self, info_list):
result = []
@@ -49,16 +56,33 @@ class ActivityRegistry(object):
return result
def get_activity(self, service_name):
+ if self._service_name_to_activity_info.has_key(service_name):
+ return self._service_name_to_activity_info[service_name]
+
info_dict = self._registry.GetActivity(service_name)
- return _activity_info_from_dict(info_dict)
+ activity_info = _activity_info_from_dict(info_dict)
+
+ self._service_name_to_activity_info[service_name] = activity_info
+ return activity_info
def find_activity(self, name):
info_list = self._registry.FindActivity(name)
return self._convert_info_list(info_list)
def get_activities_for_type(self, mime_type):
+ if self._mime_type_to_activities.has_key(mime_type):
+ return self._mime_type_to_activities[mime_type]
+
info_list = self._registry.GetActivitiesForType(mime_type)
- return self._convert_info_list(info_list)
+ activities = self._convert_info_list(info_list)
+
+ self._mime_type_to_activities[mime_type] = activities
+ return activities
+
+ def _activity_added_cb(self, bundle):
+ logging.debug('ActivityRegistry._activity_added_cb: flushing caches')
+ self._service_name_to_activity_info.clear()
+ self._mime_type_to_activities.clear()
_registry = None
diff --git a/sugar/objects/objecttype.py b/sugar/objects/objecttype.py
index dd2da54..a819216 100644
--- a/sugar/objects/objecttype.py
+++ b/sugar/objects/objecttype.py
@@ -36,20 +36,39 @@ class ObjectType(object):
self.name = name
self.icon = icon
self.mime_types = mime_types
+
+ self._type_id_to_type = {}
+ self._mime_type_to_type = {}
class ObjectTypeRegistry(object):
def __init__(self):
bus = dbus.SessionBus()
bus_object = bus.get_object(_SERVICE, _PATH)
self._registry = dbus.Interface(bus_object, _IFACE)
+
+ # Two caches fo saving some travel across dbus.
+ self._type_id_to_type = {}
+ self._mime_type_to_type = {}
def get_type(self, type_id):
+ if self._type_id_to_type.has_key(type_id):
+ return self._type_id_to_type[type_id]
+
type_dict = self._registry.GetType(type_id)
- return _object_type_from_dict(type_dict)
+ object_type = _object_type_from_dict(type_dict)
+
+ self._type_id_to_type[type_id] = object_type
+ return object_type
def get_type_for_mime(self, mime_type):
+ if self._mime_type_to_type.has_key(mime_type):
+ return self._mime_type_to_type[mime_type]
+
type_dict = self._registry.GetTypeForMIME(mime_type)
- return _object_type_from_dict(type_dict)
+ object_type = _object_type_from_dict(type_dict)
+
+ self._mime_type_to_type[mime_type] = object_type
+ return object_type
_registry = None