From 1e43f1cc77b9198fabe028472c059b0b321d8c9e Mon Sep 17 00:00:00 2001 From: Croneter Date: Tue, 10 Apr 2018 19:23:37 +0200 Subject: [PATCH] Fix playqueue monitoring locking mechanism --- resources/lib/playqueue.py | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/resources/lib/playqueue.py b/resources/lib/playqueue.py index fd188bb3..3bf8a61b 100644 --- a/resources/lib/playqueue.py +++ b/resources/lib/playqueue.py @@ -226,20 +226,26 @@ class PlayqueueMonitor(Thread): if stopped(): break sleep(1000) - for playqueue in PLAYQUEUES: - kodi_pl = js.playlist_get_items(playqueue.playlistid) - if playqueue.old_kodi_pl != kodi_pl: - if playqueue.id is None and (not state.DIRECT_PATHS or - state.CONTEXT_MENU_PLAY): - # Only initialize if directly fired up using direct - # paths. Otherwise let default.py do its magic - LOG.debug('Not yet initiating playback') - elif playqueue.pkc_edit: - playqueue.pkc_edit = False - LOG.debug('PKC just edited the playqueue - skipping') - else: - # compare old and new playqueue - self._compare_playqueues(playqueue, kodi_pl) - playqueue.old_kodi_pl = list(kodi_pl) + work = [] + # Detect changed playqueues first, do the work afterwards + with LOCK: + for playqueue in PLAYQUEUES: + kodi_pl = js.playlist_get_items(playqueue.playlistid) + if playqueue.old_kodi_pl != kodi_pl: + if playqueue.id is None and (not state.DIRECT_PATHS or + state.CONTEXT_MENU_PLAY): + # Only initialize if directly fired up using direct + # paths. Otherwise let default.py do its magic + LOG.debug('Not yet initiating playback') + elif playqueue.pkc_edit: + playqueue.pkc_edit = False + LOG.debug('PKC edited the playqueue - skipping') + else: + # We do need to update our playqueues + work.append((playqueue, kodi_pl)) + playqueue.old_kodi_pl = kodi_pl + # Now do the work - LOCK individual playqueue edits + for playqueue, kodi_pl in work: + self._compare_playqueues(playqueue, kodi_pl) sleep(200) LOG.info("----===## PlayqueueMonitor stopped ##===----")