Skip to content

Commit 052d7a4

Browse files
committed
implement remote event manager
1 parent d74f019 commit 052d7a4

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

libs/framework-core/source/ftrack_framework_core/client/__init__.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import uuid
77
from collections import defaultdict
88
from functools import partial
9+
import atexit
910

1011
from six import string_types
1112

@@ -20,7 +21,7 @@
2021

2122
from ftrack_utils.framework.config.tool import get_tool_config_by_name
2223

23-
from ftrack_framework_core.event import _EventHubThread
24+
from ftrack_framework_core.event import EventManager
2425

2526

2627
class Client(object):
@@ -185,21 +186,18 @@ def tool_config_options(self):
185186
return self._tool_config_options
186187

187188
@property
188-
def remote_session(self):
189-
# TODO: temporary hack for remote session
190-
if self._remote_session:
191-
return self._remote_session
189+
def remote_event_manager(self):
190+
# TODO: this is a temporal solution, 1 session should be able to act as local and remote at the same time
191+
if self._remote_event_manager:
192+
return self._remote_event_manager
192193
else:
193-
self._remote_session = ftrack_api.Session(
194-
auto_connect_event_hub=True
194+
_remote_session = ftrack_api.Session(auto_connect_event_hub=False)
195+
self._remote_event_manager = EventManager(
196+
session=_remote_session, mode=constants.event.REMOTE_EVENT_MODE
195197
)
196-
# TODO: temporary solution to start the wait thread
197-
_event_hub_thread = _EventHubThread(self._remote_session)
198-
199-
if not _event_hub_thread.is_alive():
200-
# self.logger.debug('Starting new hub thread for {}'.format(self))
201-
_event_hub_thread.start()
202-
return self._remote_session
198+
# Make sure it is shutdown
199+
atexit.register(self.close)
200+
return self._remote_event_manager
203201

204202
def __init__(
205203
self, event_manager, registry, run_in_main_thread_wrapper=None
@@ -226,7 +224,7 @@ def __init__(
226224
self.__instanced_dialogs = {}
227225
self._dialog = None
228226
self._tool_config_options = defaultdict(defaultdict)
229-
self._remote_session = None
227+
self._remote_event_manager = None
230228

231229
# Set up the run_in_main_thread decorator
232230
self.run_in_main_thread_wrapper = run_in_main_thread_wrapper
@@ -421,8 +419,9 @@ def subscribe_action_tool(
421419
'''
422420
if not options:
423421
options = dict()
424-
# TODO: we don't support dock_fn in here because is not serializable
425-
self.remote_session.event_hub.subscribe(
422+
# TODO: The event should be added to the event manager to be accesible
423+
# through subscribe and publish classes
424+
self.remote_event_manager.session.event_hub.subscribe(
426425
u'topic=ftrack.action.discover and '
427426
u'source.user.username="{0}"'.format(self.session.api_user),
428427
partial(
@@ -435,7 +434,7 @@ def subscribe_action_tool(
435434
),
436435
)
437436

438-
self.remote_session.event_hub.subscribe(
437+
self.remote_event_manager.session.event_hub.subscribe(
439438
u'topic=ftrack.action.launch and '
440439
u'data.name={0} and '
441440
u'source.user.username="{1}" and '
@@ -665,3 +664,10 @@ def verify_plugins(self, plugin_names):
665664
self.host_id, plugin_names
666665
)[0]
667666
return unregistered_plugins
667+
668+
def close(self):
669+
self.logger.debug('Shutting down client')
670+
if self._remote_event_manager:
671+
self.logger.debug('Stopping remote_event_manager')
672+
self.remote_event_manager.close()
673+
self._remote_event_manager = None

libs/framework-core/source/ftrack_framework_core/event/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self, session):
2626
super(_EventHubThread, self).__init__(name=_name)
2727
self.logger.debug('Name set for the thread: {}'.format(_name))
2828
self._session = session
29+
self._stop = False
2930

3031
def start(self):
3132
'''Start thread for *_session*.'''
@@ -34,12 +35,19 @@ def start(self):
3435
)
3536
super(_EventHubThread, self).start()
3637

38+
def stop(self):
39+
self.logger.debug(
40+
'stopping event hub thread for session {}'.format(self._session)
41+
)
42+
self._stop = True
43+
3744
def run(self):
3845
'''Listen for events.'''
3946
self.logger.debug(
4047
'hub thread started for session {}'.format(self._session)
4148
)
42-
self._session.event_hub.wait()
49+
while not self._stop:
50+
self._session.event_hub.wait(0.2)
4351

4452

4553
class EventManager(object):
@@ -108,6 +116,13 @@ def _wait(self):
108116
# self.logger.debug('Starting new hub thread for {}'.format(self))
109117
self._event_hub_thread.start()
110118

119+
def close(self):
120+
if self._event_hub_thread and self._event_hub_thread.is_alive():
121+
self.logger.debug('Stopping event hub thread')
122+
self._event_hub_thread.stop()
123+
self._event_hub_thread = None
124+
self.session.close()
125+
111126
def __init__(self, session, mode=constants.event.LOCAL_EVENT_MODE):
112127
self.logger = logging.getLogger(
113128
__name__ + '.' + self.__class__.__name__

0 commit comments

Comments
 (0)