huangcm
2025-02-24 69ed55dec4b2116a19e4cca4393cbc014fce5fb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
 
"""Tester feedback backend service implementation."""
 
import SimpleXMLRPCServer
import multiprocessing
 
import feedback_delegate
import request_multiplexer
 
# TODO(garnold) Load query delegate implementations as they become available
# (b/26769927).
# pylint: disable=unused-import
import audio_query_delegate_impl
 
 
class FeedbackService(object):
    """The feedback service main object."""
 
    def __init__(self):
        self._multiplexer = None
        self._server_port = 0
        self._server_process = None
        self._running = False
 
 
    @property
    def server_port(self):
        """Returns the service listening port."""
        return self._server_port
 
 
    def start(self):
        """Starts the feedback service."""
        if self._running:
            return
 
        # Start the feedback request multiplexer.
        self._multiplexer = request_multiplexer.FeedbackRequestMultiplexer()
        self._multiplexer.start()
 
        # Start the feedback delegate RPC server.
        rpc_server = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 0))
        rpc_server.register_instance(
                feedback_delegate.FeedbackDelegate(self._multiplexer))
        self._server_port = rpc_server.server_address[1]
        self._server_process = multiprocessing.Process(
                target=rpc_server.serve_forever)
        self._server_process.start()
 
        self._running = True
 
 
    def stop(self):
        """Stops the feedback service."""
        if not self._running:
            return
 
        # Stop the RPC server.
        self._server_process.terminate()
        self._server_process.join()
        self._server_port = 0
 
        # Stop the multiplexer.
        self._multiplexer.stop()
 
        self._running = False