class OLAThread(Thread):
    """The thread which runs the OLA Client."""
    def __init__(self, ola_client):
        super(OLAThread, self).__init__()
        self._client = ola_client
        self._ss = None  # created in run()

    def run(self):
        self._ss = SelectServer()
        self._ss.AddReadDescriptor(self._client.GetSocket(),
                                   self._client.SocketReady)
        self._ss.Run()
        logging.info('OLA thread finished')

    def Stop(self):
        if self._ss is None:
            logging.critical(
                'OLAThread.Stop() called before thread was running')
            return

        logging.info('Stopping OLA thread')
        self._ss.Terminate()

    def Execute(self, cb):
        self._ss.Execute(cb)

    def FetchUniverses(self):
        return self.MakeSyncClientCall(self._client.FetchUniverses)

    def FetchUIDList(self, *args):
        return self.MakeSyncClientCall(self._client.FetchUIDList, *args)

    def RunRDMDiscovery(self, *args):
        return self.MakeSyncClientCall(self._client.RunRDMDiscovery, *args)

    def MakeSyncClientCall(self, method, *method_args):
        """Turns an async call into a sync (blocking one).

    Args:
      wrapper: the ClientWrapper object
      method: the method to call
      *method_args: Any arguments to pass to the method

    Returns:
      The arguments that would have been passed to the callback function.
    """
        global args_result
        event = Event()

        def Callback(*args, **kwargs):
            global args_result
            args_result = args
            event.set()

        def RunMethod():
            method(*method_args, callback=Callback)

        self._ss.Execute(RunMethod)
        event.wait()
        return args_result
예제 #2
0
 def run(self):
     self._ss = SelectServer()
     self._ss.AddReadDescriptor(self._client.GetSocket(),
                                self._client.SocketReady)
     self._ss.Run()
     logging.info('OLA thread finished')