60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
import logging
|
|
import threading
|
|
|
|
import gobject
|
|
gobject.threads_init()
|
|
|
|
from pykka import ActorDeadError
|
|
|
|
from mopidy import SettingsError
|
|
|
|
logger = logging.getLogger('mopidy.utils.process')
|
|
|
|
|
|
class BaseThread(threading.Thread):
|
|
def __init__(self):
|
|
super(BaseThread, self).__init__()
|
|
# No thread should block process from exiting
|
|
self.daemon = True
|
|
|
|
def run(self):
|
|
logger.debug(u'%s: Starting thread', self.name)
|
|
try:
|
|
self.run_inside_try()
|
|
except KeyboardInterrupt:
|
|
logger.info(u'Interrupted by user')
|
|
except SettingsError as e:
|
|
logger.error(e.message)
|
|
except ImportError as e:
|
|
logger.error(e)
|
|
except ActorDeadError as e:
|
|
logger.warning(e)
|
|
except Exception as e:
|
|
logger.exception(e)
|
|
logger.debug(u'%s: Exiting thread', self.name)
|
|
|
|
def run_inside_try(self):
|
|
raise NotImplementedError
|
|
|
|
|
|
class GObjectEventThread(BaseThread):
|
|
"""
|
|
A GObject event loop which is shared by all Mopidy components that uses
|
|
libraries that need a GObject event loop, like GStreamer and D-Bus.
|
|
|
|
Should be started by Mopidy's core and used by
|
|
:mod:`mopidy.output.gstreamer`, :mod:`mopidy.frontend.mpris`, etc.
|
|
"""
|
|
|
|
def __init__(self):
|
|
super(GObjectEventThread, self).__init__()
|
|
self.name = u'GObjectEventThread'
|
|
self.loop = None
|
|
|
|
def run_inside_try(self):
|
|
self.loop = gobject.MainLoop().run()
|
|
|
|
def destroy(self):
|
|
self.loop.quit()
|
|
super(GObjectEventThread, self).destroy()
|