diff options
Diffstat (limited to 'bitbake/lib/bb/ui/uievent.py')
| -rw-r--r-- | bitbake/lib/bb/ui/uievent.py | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/bitbake/lib/bb/ui/uievent.py b/bitbake/lib/bb/ui/uievent.py deleted file mode 100644 index c2f830d530..0000000000 --- a/bitbake/lib/bb/ui/uievent.py +++ /dev/null | |||
| @@ -1,144 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Copyright (C) 2006 - 2007 Michael 'Mickey' Lauer | ||
| 3 | # Copyright (C) 2006 - 2007 Richard Purdie | ||
| 4 | # | ||
| 5 | # SPDX-License-Identifier: GPL-2.0-only | ||
| 6 | # | ||
| 7 | |||
| 8 | """ | ||
| 9 | Use this class to fork off a thread to recieve event callbacks from the bitbake | ||
| 10 | server and queue them for the UI to process. This process must be used to avoid | ||
| 11 | client/server deadlocks. | ||
| 12 | """ | ||
| 13 | |||
| 14 | import collections, logging, pickle, socket, threading | ||
| 15 | from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler | ||
| 16 | |||
| 17 | import bb | ||
| 18 | |||
| 19 | logger = logging.getLogger(__name__) | ||
| 20 | |||
| 21 | class BBUIEventQueue: | ||
| 22 | def __init__(self, BBServer, clientinfo=("localhost, 0")): | ||
| 23 | |||
| 24 | self.eventQueue = [] | ||
| 25 | self.eventQueueLock = threading.Lock() | ||
| 26 | self.eventQueueNotify = threading.Event() | ||
| 27 | |||
| 28 | self.BBServer = BBServer | ||
| 29 | self.clientinfo = clientinfo | ||
| 30 | |||
| 31 | server = UIXMLRPCServer(self.clientinfo) | ||
| 32 | self.host, self.port = server.socket.getsockname() | ||
| 33 | |||
| 34 | server.register_function( self.system_quit, "event.quit" ) | ||
| 35 | server.register_function( self.send_event, "event.sendpickle" ) | ||
| 36 | server.socket.settimeout(1) | ||
| 37 | |||
| 38 | self.EventHandle = None | ||
| 39 | |||
| 40 | # the event handler registration may fail here due to cooker being in invalid state | ||
| 41 | # this is a transient situation, and we should retry a couple of times before | ||
| 42 | # giving up | ||
| 43 | |||
| 44 | for count_tries in range(5): | ||
| 45 | ret = self.BBServer.registerEventHandler(self.host, self.port) | ||
| 46 | |||
| 47 | if isinstance(ret, collections.abc.Iterable): | ||
| 48 | self.EventHandle, error = ret | ||
| 49 | else: | ||
| 50 | self.EventHandle = ret | ||
| 51 | error = "" | ||
| 52 | |||
| 53 | if self.EventHandle is not None: | ||
| 54 | break | ||
| 55 | |||
| 56 | errmsg = "Could not register UI event handler. Error: %s, host %s, "\ | ||
| 57 | "port %d" % (error, self.host, self.port) | ||
| 58 | bb.warn("%s, retry" % errmsg) | ||
| 59 | |||
| 60 | import time | ||
| 61 | time.sleep(1) | ||
| 62 | else: | ||
| 63 | raise Exception(errmsg) | ||
| 64 | |||
| 65 | self.server = server | ||
| 66 | |||
| 67 | self.t = threading.Thread() | ||
| 68 | self.t.daemon = True | ||
| 69 | self.t.run = self.startCallbackHandler | ||
| 70 | self.t.start() | ||
| 71 | |||
| 72 | def getEvent(self): | ||
| 73 | with bb.utils.lock_timeout(self.eventQueueLock): | ||
| 74 | if not self.eventQueue: | ||
| 75 | return None | ||
| 76 | item = self.eventQueue.pop(0) | ||
| 77 | if not self.eventQueue: | ||
| 78 | self.eventQueueNotify.clear() | ||
| 79 | return item | ||
| 80 | |||
| 81 | def waitEvent(self, delay): | ||
| 82 | self.eventQueueNotify.wait(delay) | ||
| 83 | return self.getEvent() | ||
| 84 | |||
| 85 | def queue_event(self, event): | ||
| 86 | with bb.utils.lock_timeout(self.eventQueueLock): | ||
| 87 | self.eventQueue.append(event) | ||
| 88 | self.eventQueueNotify.set() | ||
| 89 | |||
| 90 | def send_event(self, event): | ||
| 91 | self.queue_event(pickle.loads(event)) | ||
| 92 | |||
| 93 | def startCallbackHandler(self): | ||
| 94 | |||
| 95 | self.server.timeout = 1 | ||
| 96 | bb.utils.set_process_name("UIEventQueue") | ||
| 97 | while not self.server.quit: | ||
| 98 | try: | ||
| 99 | self.server.handle_request() | ||
| 100 | except Exception as e: | ||
| 101 | import traceback | ||
| 102 | logger.error("BBUIEventQueue.startCallbackHandler: Exception while trying to handle request: %s\n%s" % (e, traceback.format_exc())) | ||
| 103 | |||
| 104 | self.server.server_close() | ||
| 105 | |||
| 106 | def system_quit( self ): | ||
| 107 | """ | ||
| 108 | Shut down the callback thread | ||
| 109 | """ | ||
| 110 | try: | ||
| 111 | self.BBServer.unregisterEventHandler(self.EventHandle) | ||
| 112 | except: | ||
| 113 | pass | ||
| 114 | self.server.quit = True | ||
| 115 | |||
| 116 | class UIXMLRPCServer (SimpleXMLRPCServer): | ||
| 117 | |||
| 118 | def __init__( self, interface ): | ||
| 119 | self.quit = False | ||
| 120 | SimpleXMLRPCServer.__init__( self, | ||
| 121 | interface, | ||
| 122 | requestHandler=SimpleXMLRPCRequestHandler, | ||
| 123 | logRequests=False, allow_none=True, use_builtin_types=True) | ||
| 124 | |||
| 125 | def get_request(self): | ||
| 126 | while not self.quit: | ||
| 127 | try: | ||
| 128 | sock, addr = self.socket.accept() | ||
| 129 | sock.settimeout(1) | ||
| 130 | return (sock, addr) | ||
| 131 | except socket.timeout: | ||
| 132 | pass | ||
| 133 | return (None, None) | ||
| 134 | |||
| 135 | def close_request(self, request): | ||
| 136 | if request is None: | ||
| 137 | return | ||
| 138 | SimpleXMLRPCServer.close_request(self, request) | ||
| 139 | |||
| 140 | def process_request(self, request, client_address): | ||
| 141 | if request is None: | ||
| 142 | return | ||
| 143 | SimpleXMLRPCServer.process_request(self, request, client_address) | ||
| 144 | |||
