Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 31 additions & 42 deletions apptools/preferences/preferences.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def __init__(self, **traits):
self._lk = threading.Lock()

# Base class constructor.
super(Preferences, self).__init__(**traits)
super().__init__(**traits)

# If a filename has been specified then load the preferences from it.
if len(self.filename) > 0:
Expand Down Expand Up @@ -408,9 +408,8 @@ def save(self, file_or_filename=None):
def _add_dictionary_to_node(self, node, dictionary):
""" Add the contents of a dictionary to a node's preferences. """

self._lk.acquire()
node._preferences.update(dictionary)
self._lk.release()
with self._lk:
node._preferences.update(dictionary)

def _add_node_to_dictionary(self, node, dictionary):
""" Add a node's preferences to a dictionary. """
Expand All @@ -429,32 +428,28 @@ def _add_node_to_dictionary(self, node, dictionary):
def _add_preferences_listener(self, listener):
""" Add a listener for changes to thisnode's preferences. """

self._lk.acquire()
self._preferences_listeners.append(listener)
self._lk.release()
with self._lk:
self._preferences_listeners.append(listener)

def _clear(self):
""" Remove all preferences from this node. """

self._lk.acquire()
self._preferences.clear()
self._lk.release()
with self._lk:
self._preferences.clear()

def _create_child(self, name):
""" Create a child of this node with the specified name. """

self._lk.acquire()
child = self._children[name] = Preferences(name=name, parent=self)
self._lk.release()
with self._lk:
child = self._children[name] = Preferences(name=name, parent=self)

return child

def _get(self, key, default=None):
""" Get the value of a preference in this node. """

self._lk.acquire()
value = self._preferences.get(key, default)
self._lk.release()
with self._lk:
value = self._preferences.get(key, default)

return value

Expand All @@ -465,18 +460,16 @@ def _get_child(self, name):

"""

self._lk.acquire()
child = self._children.get(name)
self._lk.release()
with self._lk:
child = self._children.get(name)

return child

def _keys(self):
""" Return the preference keys of this node. """

self._lk.acquire()
keys = list(self._preferences.keys())
self._lk.release()
with self._lk:
keys = list(self._preferences.keys())

return keys

Expand All @@ -496,27 +489,24 @@ def _node(self, name):
def _node_names(self):
""" Return the names of the children of this node. """

self._lk.acquire()
node_names = list(self._children.keys())
self._lk.release()
with self._lk:
node_names = list(self._children.keys())

return node_names

def _remove(self, name):
""" Remove a preference value from this node. """

self._lk.acquire()
if name in self._preferences:
del self._preferences[name]
self._lk.release()
with self._lk:
if name in self._preferences:
del self._preferences[name]

def _remove_preferences_listener(self, listener):
""" Remove a listener for changes to the node's preferences. """

self._lk.acquire()
if listener in self._preferences_listeners:
self._preferences_listeners.remove(listener)
self._lk.release()
with self._lk:
if listener in self._preferences_listeners:
self._preferences_listeners.remove(listener)

def _set(self, key, value):
""" Set the value of a preference in this node. """
Expand All @@ -526,17 +516,16 @@ def _set(self, key, value):
# encoded.
value = str(value)

self._lk.acquire()
old = self._preferences.get(key)
self._preferences[key] = value
with self._lk:
old = self._preferences.get(key)
self._preferences[key] = value

# If the value is unchanged then don't call the listeners!
if old == value:
listeners = []
# If the value is unchanged then don't call the listeners!
if old == value:
listeners = []

else:
listeners = self._preferences_listeners[:]
self._lk.release()
else:
listeners = self._preferences_listeners[:]

for listener in listeners:
listener(self, key, old, value)
Expand Down
1 change: 1 addition & 0 deletions docs/releases/upcoming/306.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Use context managers to handle locks in apptools.preferences (#306)