Merge pull request #101 from jodal/feature/clean-shutdown
feature/clean-shutdown
This commit is contained in:
commit
e2be61312f
@ -1,10 +1,12 @@
|
|||||||
|
import logging
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from pykka import ActorDeadError
|
||||||
from pykka.registry import ActorRegistry
|
from pykka.registry import ActorRegistry
|
||||||
|
|
||||||
from mopidy.backends.base import Backend
|
from mopidy.backends.base import Backend
|
||||||
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdArgError,
|
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdArgError,
|
||||||
MpdUnknownCommand)
|
MpdUnknownCommand, MpdSystemError)
|
||||||
from mopidy.frontends.mpd.protocol import mpd_commands, request_handlers
|
from mopidy.frontends.mpd.protocol import mpd_commands, request_handlers
|
||||||
# Do not remove the following import. The protocol modules must be imported to
|
# Do not remove the following import. The protocol modules must be imported to
|
||||||
# get them registered as request handlers.
|
# 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.mixers.base import BaseMixer
|
||||||
from mopidy.utils import flatten
|
from mopidy.utils import flatten
|
||||||
|
|
||||||
|
logger = logging.getLogger('mopidy.frontends.mpd.dispatcher')
|
||||||
|
|
||||||
class MpdDispatcher(object):
|
class MpdDispatcher(object):
|
||||||
"""
|
"""
|
||||||
The MPD session feeds the MPD dispatcher with requests. The dispatcher
|
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:
|
if command_list_index is not None:
|
||||||
e.index = command_list_index
|
e.index = command_list_index
|
||||||
return self.handle_response(e.get_mpd_ack(), add_ok=False)
|
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'):
|
if request in (u'command_list_begin', u'command_list_ok_begin'):
|
||||||
return None
|
return None
|
||||||
if command_list_index is not None:
|
if command_list_index is not None:
|
||||||
|
|||||||
@ -54,6 +54,11 @@ class MpdNoExistError(MpdAckError):
|
|||||||
super(MpdNoExistError, self).__init__(*args, **kwargs)
|
super(MpdNoExistError, self).__init__(*args, **kwargs)
|
||||||
self.error_code = MpdAckError.ACK_ERROR_NO_EXIST
|
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):
|
class MpdNotImplemented(MpdAckError):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(MpdNotImplemented, self).__init__(*args, **kwargs)
|
super(MpdNotImplemented, self).__init__(*args, **kwargs)
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import threading
|
|||||||
import gobject
|
import gobject
|
||||||
gobject.threads_init()
|
gobject.threads_init()
|
||||||
|
|
||||||
|
from pykka import ActorDeadError
|
||||||
|
|
||||||
from mopidy import SettingsError
|
from mopidy import SettingsError
|
||||||
|
|
||||||
logger = logging.getLogger('mopidy.utils.process')
|
logger = logging.getLogger('mopidy.utils.process')
|
||||||
@ -21,26 +23,19 @@ class BaseThread(threading.Thread):
|
|||||||
self.run_inside_try()
|
self.run_inside_try()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
logger.info(u'Interrupted by user')
|
logger.info(u'Interrupted by user')
|
||||||
self.exit(0, u'Interrupted by user')
|
|
||||||
except SettingsError as e:
|
except SettingsError as e:
|
||||||
logger.error(e.message)
|
logger.error(e.message)
|
||||||
self.exit(1, u'Settings error')
|
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
self.exit(2, u'Import error')
|
except ActorDeadError as e:
|
||||||
|
logger.warning(e)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(e)
|
logger.exception(e)
|
||||||
self.exit(3, u'Unknown error')
|
logger.debug(u'%s: Exiting thread', self.name)
|
||||||
|
|
||||||
def run_inside_try(self):
|
def run_inside_try(self):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def destroy(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def exit(self, status=0, reason=None):
|
|
||||||
self.destroy()
|
|
||||||
|
|
||||||
|
|
||||||
class GObjectEventThread(BaseThread):
|
class GObjectEventThread(BaseThread):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdUnknownCommand,
|
from mopidy.frontends.mpd.exceptions import (MpdAckError, MpdUnknownCommand,
|
||||||
MpdNotImplemented)
|
MpdSystemError, MpdNotImplemented)
|
||||||
|
|
||||||
class MpdExceptionsTest(unittest.TestCase):
|
class MpdExceptionsTest(unittest.TestCase):
|
||||||
def test_key_error_wrapped_in_mpd_ack_error(self):
|
def test_key_error_wrapped_in_mpd_ack_error(self):
|
||||||
@ -36,3 +36,10 @@ class MpdExceptionsTest(unittest.TestCase):
|
|||||||
except MpdAckError as e:
|
except MpdAckError as e:
|
||||||
self.assertEqual(e.get_mpd_ack(),
|
self.assertEqual(e.get_mpd_ack(),
|
||||||
u'ACK [5@0] {} unknown command "play"')
|
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')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user