xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/multiprocessing/dummy/connection.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker#
2*cda5da8dSAndroid Build Coastguard Worker# Analogue of `multiprocessing.connection` which uses queues instead of sockets
3*cda5da8dSAndroid Build Coastguard Worker#
4*cda5da8dSAndroid Build Coastguard Worker# multiprocessing/dummy/connection.py
5*cda5da8dSAndroid Build Coastguard Worker#
6*cda5da8dSAndroid Build Coastguard Worker# Copyright (c) 2006-2008, R Oudkerk
7*cda5da8dSAndroid Build Coastguard Worker# Licensed to PSF under a Contributor Agreement.
8*cda5da8dSAndroid Build Coastguard Worker#
9*cda5da8dSAndroid Build Coastguard Worker
10*cda5da8dSAndroid Build Coastguard Worker__all__ = [ 'Client', 'Listener', 'Pipe' ]
11*cda5da8dSAndroid Build Coastguard Worker
12*cda5da8dSAndroid Build Coastguard Workerfrom queue import Queue
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Workerfamilies = [None]
16*cda5da8dSAndroid Build Coastguard Worker
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Workerclass Listener(object):
19*cda5da8dSAndroid Build Coastguard Worker
20*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, address=None, family=None, backlog=1):
21*cda5da8dSAndroid Build Coastguard Worker        self._backlog_queue = Queue(backlog)
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker    def accept(self):
24*cda5da8dSAndroid Build Coastguard Worker        return Connection(*self._backlog_queue.get())
25*cda5da8dSAndroid Build Coastguard Worker
26*cda5da8dSAndroid Build Coastguard Worker    def close(self):
27*cda5da8dSAndroid Build Coastguard Worker        self._backlog_queue = None
28*cda5da8dSAndroid Build Coastguard Worker
29*cda5da8dSAndroid Build Coastguard Worker    @property
30*cda5da8dSAndroid Build Coastguard Worker    def address(self):
31*cda5da8dSAndroid Build Coastguard Worker        return self._backlog_queue
32*cda5da8dSAndroid Build Coastguard Worker
33*cda5da8dSAndroid Build Coastguard Worker    def __enter__(self):
34*cda5da8dSAndroid Build Coastguard Worker        return self
35*cda5da8dSAndroid Build Coastguard Worker
36*cda5da8dSAndroid Build Coastguard Worker    def __exit__(self, exc_type, exc_value, exc_tb):
37*cda5da8dSAndroid Build Coastguard Worker        self.close()
38*cda5da8dSAndroid Build Coastguard Worker
39*cda5da8dSAndroid Build Coastguard Worker
40*cda5da8dSAndroid Build Coastguard Workerdef Client(address):
41*cda5da8dSAndroid Build Coastguard Worker    _in, _out = Queue(), Queue()
42*cda5da8dSAndroid Build Coastguard Worker    address.put((_out, _in))
43*cda5da8dSAndroid Build Coastguard Worker    return Connection(_in, _out)
44*cda5da8dSAndroid Build Coastguard Worker
45*cda5da8dSAndroid Build Coastguard Worker
46*cda5da8dSAndroid Build Coastguard Workerdef Pipe(duplex=True):
47*cda5da8dSAndroid Build Coastguard Worker    a, b = Queue(), Queue()
48*cda5da8dSAndroid Build Coastguard Worker    return Connection(a, b), Connection(b, a)
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Worker
51*cda5da8dSAndroid Build Coastguard Workerclass Connection(object):
52*cda5da8dSAndroid Build Coastguard Worker
53*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, _in, _out):
54*cda5da8dSAndroid Build Coastguard Worker        self._out = _out
55*cda5da8dSAndroid Build Coastguard Worker        self._in = _in
56*cda5da8dSAndroid Build Coastguard Worker        self.send = self.send_bytes = _out.put
57*cda5da8dSAndroid Build Coastguard Worker        self.recv = self.recv_bytes = _in.get
58*cda5da8dSAndroid Build Coastguard Worker
59*cda5da8dSAndroid Build Coastguard Worker    def poll(self, timeout=0.0):
60*cda5da8dSAndroid Build Coastguard Worker        if self._in.qsize() > 0:
61*cda5da8dSAndroid Build Coastguard Worker            return True
62*cda5da8dSAndroid Build Coastguard Worker        if timeout <= 0.0:
63*cda5da8dSAndroid Build Coastguard Worker            return False
64*cda5da8dSAndroid Build Coastguard Worker        with self._in.not_empty:
65*cda5da8dSAndroid Build Coastguard Worker            self._in.not_empty.wait(timeout)
66*cda5da8dSAndroid Build Coastguard Worker        return self._in.qsize() > 0
67*cda5da8dSAndroid Build Coastguard Worker
68*cda5da8dSAndroid Build Coastguard Worker    def close(self):
69*cda5da8dSAndroid Build Coastguard Worker        pass
70*cda5da8dSAndroid Build Coastguard Worker
71*cda5da8dSAndroid Build Coastguard Worker    def __enter__(self):
72*cda5da8dSAndroid Build Coastguard Worker        return self
73*cda5da8dSAndroid Build Coastguard Worker
74*cda5da8dSAndroid Build Coastguard Worker    def __exit__(self, exc_type, exc_value, exc_tb):
75*cda5da8dSAndroid Build Coastguard Worker        self.close()
76