Merge pull request #101 from jodal/feature/clean-shutdown

feature/clean-shutdown
This commit is contained in:
Thomas Adamcik 2011-06-03 15:09:21 -07:00
commit e2be61312f
4 changed files with 27 additions and 12 deletions

View File

@ -1,10 +1,12 @@
import logging
import re
from pykka import ActorDeadError
from pykka.registry import ActorRegistry
from mopidy.backends.base import Backend
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdArgError,
MpdUnknownCommand)
MpdUnknownCommand, MpdSystemError)
from mopidy.frontends.mpd.protocol import mpd_commands, request_handlers
# Do not remove the following import. The protocol modules must be imported to
# get them registered as request handlers.
@ -16,6 +18,8 @@ from mopidy.frontends.mpd.protocol import (audio_output, command_list,
from mopidy.mixers.base import BaseMixer
from mopidy.utils import flatten
logger = logging.getLogger('mopidy.frontends.mpd.dispatcher')
class MpdDispatcher(object):
"""
The MPD session feeds the MPD dispatcher with requests. The dispatcher
@ -49,6 +53,10 @@ class MpdDispatcher(object):
if command_list_index is not None:
e.index = command_list_index
return self.handle_response(e.get_mpd_ack(), add_ok=False)
except ActorDeadError as e:
logger.warning(u'Tried to communicate with dead actor.')
mpd_error = MpdSystemError(e.message)
return self.handle_response(mpd_error.get_mpd_ack(), add_ok=False)
if request in (u'command_list_begin', u'command_list_ok_begin'):
return None
if command_list_index is not None:

View File

@ -54,6 +54,11 @@ class MpdNoExistError(MpdAckError):
super(MpdNoExistError, self).__init__(*args, **kwargs)
self.error_code = MpdAckError.ACK_ERROR_NO_EXIST
class MpdSystemError(MpdAckError):
def __init__(self, *args, **kwargs):
super(MpdSystemError, self).__init__(*args, **kwargs)
self.error_code = MpdAckError.ACK_ERROR_SYSTEM
class MpdNotImplemented(MpdAckError):
def __init__(self, *args, **kwargs):
super(MpdNotImplemented, self).__init__(*args, **kwargs)

View File

@ -4,6 +4,8 @@ import threading
import gobject
gobject.threads_init()
from pykka import ActorDeadError
from mopidy import SettingsError
logger = logging.getLogger('mopidy.utils.process')
@ -21,26 +23,19 @@ class BaseThread(threading.Thread):
self.run_inside_try()
except KeyboardInterrupt:
logger.info(u'Interrupted by user')
self.exit(0, u'Interrupted by user')
except SettingsError as e:
logger.error(e.message)
self.exit(1, u'Settings error')
except ImportError as e:
logger.error(e)
self.exit(2, u'Import error')
except ActorDeadError as e:
logger.warning(e)
except Exception as e:
logger.exception(e)
self.exit(3, u'Unknown error')
logger.debug(u'%s: Exiting thread', self.name)
def run_inside_try(self):
raise NotImplementedError
def destroy(self):
pass
def exit(self, status=0, reason=None):
self.destroy()
class GObjectEventThread(BaseThread):
"""

View File

@ -1,7 +1,7 @@
import unittest
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdUnknownCommand,
MpdNotImplemented)
MpdSystemError, MpdNotImplemented)
class MpdExceptionsTest(unittest.TestCase):
def test_key_error_wrapped_in_mpd_ack_error(self):
@ -36,3 +36,10 @@ class MpdExceptionsTest(unittest.TestCase):
except MpdAckError as e:
self.assertEqual(e.get_mpd_ack(),
u'ACK [5@0] {} unknown command "play"')
def test_mpd_system_error(self):
try:
raise MpdSystemError('foo')
except MpdSystemError as e:
self.assertEqual(e.get_mpd_ack(),
u'ACK [52@0] {} foo')