[RigoDaemon] use context manager with ReadersWritersSemaphore

This commit is contained in:
Fabio Erculiani
2013-12-06 21:13:08 +01:00
parent 65f5dce076
commit d88e33c40c

View File

@@ -888,13 +888,11 @@ class RigoDaemonService(dbus.service.Object):
self._acquire_shared()
try:
self._rwsem.reader_acquire()
try:
self._entropy.clean_downloaded_packages()
except AttributeError:
pass
finally:
self._rwsem.reader_release()
with self._rwsem.reader():
try:
self._entropy.clean_downloaded_packages()
except AttributeError:
pass
finally:
self._release_shared()
@@ -1150,11 +1148,8 @@ class RigoDaemonService(dbus.service.Object):
self._close_local_resources()
self._entropy_setup()
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
self._installed_repository_updated_unlocked()
finally:
self._rwsem.reader_release()
finally:
self._release_shared()
finally:
@@ -1299,8 +1294,7 @@ class RigoDaemonService(dbus.service.Object):
GLib.idle_add(
self.activity_progress, activity, 0)
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
if not repositories:
repositories = list(
SystemSettings()['repositories']['available'])
@@ -1311,8 +1305,6 @@ class RigoDaemonService(dbus.service.Object):
updater = self._entropy.Repositories(
repositories, force = force)
result = updater.unlocked_sync()
finally:
self._rwsem.reader_release()
except AttributeError as err:
write_output("_update_repositories error: %s" % (err,))
@@ -1353,23 +1345,21 @@ class RigoDaemonService(dbus.service.Object):
"this is a package file, generating "
"repo", debug=True)
self._rwsem.writer_acquire()
try:
pkg_matches = self._entropy.add_package_repository(
path)
return pkg_matches, True
except EntropyPackageException as err:
write_output("_maybe_setup_package_repository: "
"invalid package file, "
"%s" % (err,), debug=True)
return None, False
except Exception as err:
write_output("_maybe_setup_package_repository: "
"error during repository setup (err), "
"%s" % (repr(err),), debug=True)
return None, False
finally:
self._rwsem.writer_release()
with self._rwsem.writer():
try:
pkg_matches = self._entropy.add_package_repository(
path)
return pkg_matches, True
except EntropyPackageException as err:
write_output("_maybe_setup_package_repository: "
"invalid package file, "
"%s" % (err,), debug=True)
return None, False
except Exception as err:
write_output("_maybe_setup_package_repository: "
"error during repository setup (err), "
"%s" % (repr(err),), debug=True)
return None, False
return None, True
@@ -1383,8 +1373,8 @@ class RigoDaemonService(dbus.service.Object):
"_maybe_dismantle_package_repository: "
"about to acquire rwsem for %s" % (pkg_matches,),
debug=True)
self._rwsem.writer_acquire()
try:
with self._rwsem.writer():
write_output(
"_maybe_dismantle_package_repository: "
"acquired rwsem for %s" % (pkg_matches,),
@@ -1397,8 +1387,6 @@ class RigoDaemonService(dbus.service.Object):
"_maybe_dismantle_package_repository: "
"error during repository removal (err), "
"%s" % (repr(err),), debug=True)
finally:
self._rwsem.writer_release()
def _action_queue_worker_thread(self):
@@ -1585,14 +1573,13 @@ class RigoDaemonService(dbus.service.Object):
outcome = AppTransactionOutcome.INSTALL_ERROR
return
self._rwsem.reader_acquire()
try:
outcome = self._process_action(item, activity, is_app)
write_output("_action_queue_worker_thread, "
"returned outcome: %s" % (
outcome,), debug=True)
with self._rwsem.reader():
outcome = self._process_action(item, activity, is_app)
write_output("_action_queue_worker_thread, "
"returned outcome: %s" % (
outcome,), debug=True)
finally:
self._rwsem.reader_release()
if is_app and pkg_matches:
self._maybe_dismantle_package_repository(pkg_matches)
@@ -1838,6 +1825,7 @@ class RigoDaemonService(dbus.service.Object):
count = 0
total = len(removal_queue)
action_factory = self._entropy.PackageActionFactory()
inst_repo = self._entropy.installed_repository()
try:
for pkg_match in removal_queue:
@@ -1904,7 +1892,7 @@ class RigoDaemonService(dbus.service.Object):
"_process_remove_merge_action: "
"%s, count: %s, total: %s, done, committing." % (
pkg_match, count, total), debug=True)
self._entropy.installed_repository().commit()
inst_repo.commit()
# Remove us from the ongoing transactions
self._txs.unset(package_id, repository_id)
@@ -1924,7 +1912,7 @@ class RigoDaemonService(dbus.service.Object):
"_process_remove_merge_action: "
"count: %s, total: %s, finally stmt, committing." % (
count, total), debug=True)
self._entropy.installed_repository().commit()
inst_repo.commit()
def _maybe_enqueue_kernel_switcher_actions(self, simulate, package_id,
repository_id, path):
@@ -2367,6 +2355,7 @@ class RigoDaemonService(dbus.service.Object):
AppTransactionStates.MANAGE, amount)
action_factory = self._entropy.PackageActionFactory()
inst_repo = self._entropy.installed_repository()
try:
for pkg_match in install_queue:
@@ -2434,7 +2423,7 @@ class RigoDaemonService(dbus.service.Object):
"%s, count: %s, total: %s, done, committing." % (
pkg_match, count, total), debug=True)
self._entropy.installed_repository().commit()
inst_repo.commit()
# Remove us from the ongoing transactions
self._txs.unset(package_id, repository_id)
@@ -2458,20 +2447,17 @@ class RigoDaemonService(dbus.service.Object):
"_process_install_merge_action: "
"count: %s, total: %s, finally stmt, committing." % (
count, total), debug=True)
self._entropy.installed_repository().commit()
inst_repo.commit()
def _maybe_signal_preserved_libraries(self):
"""
Signal preserved libraries if needed.
"""
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
inst_repo = self._entropy.installed_repository()
preserved_mgr = PreservedLibraries(
inst_repo, None, frozenset(), root=etpConst['systemroot'])
preserved = preserved_mgr.list()
finally:
self._rwsem.reader_release()
if preserved:
GLib.idle_add(
@@ -2504,8 +2490,7 @@ class RigoDaemonService(dbus.service.Object):
Return the latest (or a new one if not initialized yet)
ConfigurationFiles object.
"""
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
with self._config_updates_mutex:
if self._config_updates is None or _force:
updates = self._entropy.ConfigurationUpdates()
@@ -2514,8 +2499,6 @@ class RigoDaemonService(dbus.service.Object):
self._config_updates = scandata
else:
scandata = self._config_updates
finally:
self._rwsem.reader_release()
return scandata
def _enrich_configuration_updates(self, scandata):
@@ -2540,11 +2523,8 @@ class RigoDaemonService(dbus.service.Object):
Close any Entropy resource that might have been changed
or replaced.
"""
self._rwsem.writer_acquire()
try:
with self._rwsem.writer():
self._close_local_resources_unlocked()
finally:
self._rwsem.writer_release()
def _close_local_resources_unlocked(self):
"""
@@ -2718,15 +2698,12 @@ class RigoDaemonService(dbus.service.Object):
Here we reload Entropy configuration and other resources.
"""
write_output("_entropy_setup(): called", debug=True)
self._rwsem.writer_acquire()
try:
with self._rwsem.writer():
initconfig_entropy_constants(etpConst['systemroot'])
self._entropy.Settings().clear()
self._entropy._validate_repositories()
self._close_local_resources_unlocked()
finally:
self._rwsem.writer_release()
write_output("_entropy_setup(): complete", debug=True)
write_output("_entropy_setup(): complete", debug=True)
def _send_greetings(self):
"""
@@ -2744,12 +2721,10 @@ class RigoDaemonService(dbus.service.Object):
self._close_local_resources()
self._entropy_setup()
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
unavailable_repositories = \
self._entropy.unavailable_repositories()
finally:
self._rwsem.reader_release()
if unavailable_repositories:
GLib.idle_add(
self.unavailable_repositories,
@@ -2758,12 +2733,8 @@ class RigoDaemonService(dbus.service.Object):
if Repository.are_repositories_old():
GLib.idle_add(self.old_repositories)
self._rwsem.reader_acquire()
try:
# signal updates available
with self._rwsem.reader():
self._installed_repository_updated_unlocked()
finally:
self._rwsem.reader_release()
self._maybe_signal_noticeboards_available_unlocked()
@@ -2779,8 +2750,7 @@ class RigoDaemonService(dbus.service.Object):
Resources Lock acquired, no activity mutex acquired)
of _maybe_signal_noticeboards_available()
"""
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
notices = []
for repository in self._entropy.repositories():
notice = self._entropy.get_noticeboard(
@@ -2788,8 +2758,6 @@ class RigoDaemonService(dbus.service.Object):
if not notice:
continue
notices.append((repository, notice))
finally:
self._rwsem.reader_release()
if notices:
GLib.idle_add(
@@ -3162,13 +3130,10 @@ class RigoDaemonService(dbus.service.Object):
write_output("accept_licenses called: %s" % (names,),
debug=True)
def _accept():
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
inst_repo = self._entropy.installed_repository()
for name in names:
inst_repo.acceptLicense(name)
finally:
self._rwsem.reader_release()
task = ParallelTask(_accept)
task.daemon = True
@@ -3323,11 +3288,8 @@ class RigoDaemonService(dbus.service.Object):
try:
done = False
self._rwsem.writer_acquire()
try:
with self._rwsem.writer():
done = method(*args, **kwargs)
finally:
self._rwsem.writer_release()
return done
finally:
@@ -3450,14 +3412,11 @@ class RigoDaemonService(dbus.service.Object):
if not authorized:
return
self._rwsem.reader_acquire()
try:
with self._rwsem.reader():
updates = self._entropy.ConfigurationUpdates()
with self._config_updates_mutex:
scandata = updates.get()
self._config_updates = scandata
finally:
self._rwsem.reader_release()
task = ParallelTask(
_reload,