Skip to content

Commit d645a78

Browse files
committed
[#71] Removed GLib dependency.
This replaces the GLib dependency (used to handle connection events) with asyncio. Context: #71
1 parent af26680 commit d645a78

File tree

4 files changed

+148
-179
lines changed

4 files changed

+148
-179
lines changed

src/mopidy_mpd/actor.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import asyncio
12
import logging
3+
import threading
24
from typing import Any
35

46
import pykka
@@ -37,7 +39,11 @@ def __init__(self, config: types.Config, core: CoreProxy) -> None:
3739
self.zeroconf_service = None
3840

3941
self.uri_map = uri_mapper.MpdUriMapper(core)
42+
self.loop = asyncio.new_event_loop()
43+
asyncio.set_event_loop(self.loop)
44+
4045
self.server = self._setup_server(config, core)
46+
self.server_thread = threading.Thread(target=self._run_server)
4147

4248
def _setup_server(self, config: types.Config, core: CoreProxy) -> network.Server:
4349
try:
@@ -54,11 +60,16 @@ def _setup_server(self, config: types.Config, core: CoreProxy) -> network.Server
5460
except OSError as exc:
5561
raise exceptions.FrontendError(f"MPD server startup failed: {exc}") from exc
5662

57-
logger.info(f"MPD server running at {network.format_address(server.address)}")
63+
logger.info("MPD server running at %s", network.format_address(server.address))
5864

5965
return server
6066

67+
def _run_server(self) -> None:
68+
self.loop.run_until_complete(self.server.run())
69+
6170
def on_start(self) -> None:
71+
self.server_thread.start()
72+
6273
if self.zeroconf_name and not network.is_unix_socket(self.server.server_socket):
6374
self.zeroconf_service = zeroconf.Zeroconf(
6475
name=self.zeroconf_name, stype="_mpd._tcp", port=self.port
@@ -73,7 +84,13 @@ def on_stop(self) -> None:
7384
for session_actor in session_actors:
7485
session_actor.stop()
7586

76-
self.server.stop()
87+
if not self.server_thread.is_alive():
88+
logger.warning("MPD server already stopped")
89+
return
90+
91+
self.loop.call_soon_threadsafe(self.server.stop)
92+
logger.debug("Waiting for MPD server thread to terminate")
93+
self.server_thread.join()
7794

7895
def on_event(self, event: str, **kwargs: Any) -> None:
7996
if event not in _CORE_EVENTS_TO_IDLE_SUBSYSTEMS:

src/mopidy_mpd/dispatcher.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import asyncio
34
import logging
45
from collections.abc import Callable
56
from typing import (
@@ -100,7 +101,10 @@ def handle_idle(self, subsystem: str) -> None:
100101
response = [*[f"changed: {s}" for s in subsystems], "OK"]
101102
self.subsystem_events = set()
102103
self.subsystem_subscriptions = set()
103-
self.session.send_lines(response)
104+
asyncio.run_coroutine_threadsafe(
105+
self.session.send_lines(response),
106+
self.session.loop,
107+
)
104108

105109
def _call_next_filter(
106110
self, request: Request, response: Response, filter_chain: list[Filter]

0 commit comments

Comments
 (0)