[Pkg-mpd-commits] [python-mpd] 60/262: mpd.py: check if iterating before fetching response

Simon McVittie smcv at debian.org
Sun May 22 18:16:25 UTC 2016


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch upstream
in repository python-mpd.

commit 535e659098997d301a7176e45bfc806bbc5cedb4
Author: J. Alexander Treuman <jat at spatialrift.net>
Date:   Thu Jul 15 17:12:53 2010 -0400

    mpd.py: check if iterating before fetching response
    
    If an iterator is currently in progress, all functions which fetch a
    response (such as <cmd>() and fetch_<cmd>()) will be disabled, as well as
    command lists.  This makes iterators much more reliable by preventing code
    from reading a response while an iterator is trying to read another
    response.  Previously this was allowed, and would corrupt the library state
    by providing false responses to both the iterator and the code trying to
    fetch a different response.
---
 mpd.py | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/mpd.py b/mpd.py
index 32b51a1..8810fac 100644
--- a/mpd.py
+++ b/mpd.py
@@ -41,6 +41,9 @@ class CommandListError(MPDError):
 class PendingCommandError(MPDError):
     pass
 
+class IteratingError(MPDError):
+    pass
+
 
 class _NotConnected(object):
     def __getattr__(self, attr):
@@ -159,6 +162,9 @@ class MPDClient(object):
         if self._command_list is not None:
             raise CommandListError("Cannot use fetch_%s in a command list" %
                                    command)
+        if self._iterating:
+            raise IteratingError("Cannot use fetch_%s while iterating" %
+                                 command)
         if not self._pending:
             raise PendingCommandError("No pending commands to fetch")
         if self._pending[0] != command:
@@ -170,6 +176,8 @@ class MPDClient(object):
             return retval()
 
     def _execute(self, command, args):
+        if self._iterating:
+            raise IteratingError("Cannot execute %s while iterating" % command)
         if self._pending:
             raise PendingCommandError("Cannot execute %s with "
                                       "pending commands" % command)
@@ -266,10 +274,16 @@ class MPDClient(object):
         self._command_list = None
         self._fetch_nothing()
 
+    def _iterator_wrapper(self, iterator):
+        self._iterating = True
+        for item in iterator:
+            yield item
+        self._iterating = False
+
     def _wrap_iterator(self, iterator):
         if not self.iterate:
             return list(iterator)
-        return iterator
+        return self._iterator_wrapper(iterator)
 
     def _fetch_nothing(self):
         line = self._read_line()
@@ -326,6 +340,7 @@ class MPDClient(object):
 
     def _reset(self):
         self.mpd_version = None
+        self._iterating = False
         self._pending = []
         self._command_list = None
         self._sock = None
@@ -392,6 +407,8 @@ class MPDClient(object):
     def command_list_ok_begin(self):
         if self._command_list is not None:
             raise CommandListError("Already in command list")
+        if self._iterating:
+            raise IteratingError("Cannot begin command list while iterating")
         if self._pending:
             raise PendingCommandError("Cannot begin command list "
                                       "with pending commands")

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mpd/python-mpd.git



More information about the Pkg-mpd-commits mailing list