17db96d56Sopenharmony_ci#
27db96d56Sopenharmony_ci# Analogue of `multiprocessing.connection` which uses queues instead of sockets
37db96d56Sopenharmony_ci#
47db96d56Sopenharmony_ci# multiprocessing/dummy/connection.py
57db96d56Sopenharmony_ci#
67db96d56Sopenharmony_ci# Copyright (c) 2006-2008, R Oudkerk
77db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement.
87db96d56Sopenharmony_ci#
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci__all__ = [ 'Client', 'Listener', 'Pipe' ]
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cifrom queue import Queue
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cifamilies = [None]
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciclass Listener(object):
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    def __init__(self, address=None, family=None, backlog=1):
217db96d56Sopenharmony_ci        self._backlog_queue = Queue(backlog)
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    def accept(self):
247db96d56Sopenharmony_ci        return Connection(*self._backlog_queue.get())
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    def close(self):
277db96d56Sopenharmony_ci        self._backlog_queue = None
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    @property
307db96d56Sopenharmony_ci    def address(self):
317db96d56Sopenharmony_ci        return self._backlog_queue
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def __enter__(self):
347db96d56Sopenharmony_ci        return self
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci    def __exit__(self, exc_type, exc_value, exc_tb):
377db96d56Sopenharmony_ci        self.close()
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_cidef Client(address):
417db96d56Sopenharmony_ci    _in, _out = Queue(), Queue()
427db96d56Sopenharmony_ci    address.put((_out, _in))
437db96d56Sopenharmony_ci    return Connection(_in, _out)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_cidef Pipe(duplex=True):
477db96d56Sopenharmony_ci    a, b = Queue(), Queue()
487db96d56Sopenharmony_ci    return Connection(a, b), Connection(b, a)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ciclass Connection(object):
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci    def __init__(self, _in, _out):
547db96d56Sopenharmony_ci        self._out = _out
557db96d56Sopenharmony_ci        self._in = _in
567db96d56Sopenharmony_ci        self.send = self.send_bytes = _out.put
577db96d56Sopenharmony_ci        self.recv = self.recv_bytes = _in.get
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci    def poll(self, timeout=0.0):
607db96d56Sopenharmony_ci        if self._in.qsize() > 0:
617db96d56Sopenharmony_ci            return True
627db96d56Sopenharmony_ci        if timeout <= 0.0:
637db96d56Sopenharmony_ci            return False
647db96d56Sopenharmony_ci        with self._in.not_empty:
657db96d56Sopenharmony_ci            self._in.not_empty.wait(timeout)
667db96d56Sopenharmony_ci        return self._in.qsize() > 0
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci    def close(self):
697db96d56Sopenharmony_ci        pass
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def __enter__(self):
727db96d56Sopenharmony_ci        return self
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    def __exit__(self, exc_type, exc_value, exc_tb):
757db96d56Sopenharmony_ci        self.close()
76