xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/asyncio/events.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker"""Event loop and event loop policy."""
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker__all__ = (
4*cda5da8dSAndroid Build Coastguard Worker    'AbstractEventLoopPolicy',
5*cda5da8dSAndroid Build Coastguard Worker    'AbstractEventLoop', 'AbstractServer',
6*cda5da8dSAndroid Build Coastguard Worker    'Handle', 'TimerHandle',
7*cda5da8dSAndroid Build Coastguard Worker    'get_event_loop_policy', 'set_event_loop_policy',
8*cda5da8dSAndroid Build Coastguard Worker    'get_event_loop', 'set_event_loop', 'new_event_loop',
9*cda5da8dSAndroid Build Coastguard Worker    'get_child_watcher', 'set_child_watcher',
10*cda5da8dSAndroid Build Coastguard Worker    '_set_running_loop', 'get_running_loop',
11*cda5da8dSAndroid Build Coastguard Worker    '_get_running_loop',
12*cda5da8dSAndroid Build Coastguard Worker)
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard Workerimport contextvars
15*cda5da8dSAndroid Build Coastguard Workerimport os
16*cda5da8dSAndroid Build Coastguard Workerimport socket
17*cda5da8dSAndroid Build Coastguard Workerimport subprocess
18*cda5da8dSAndroid Build Coastguard Workerimport sys
19*cda5da8dSAndroid Build Coastguard Workerimport threading
20*cda5da8dSAndroid Build Coastguard Worker
21*cda5da8dSAndroid Build Coastguard Workerfrom . import format_helpers
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker
24*cda5da8dSAndroid Build Coastguard Workerclass Handle:
25*cda5da8dSAndroid Build Coastguard Worker    """Object returned by callback registration methods."""
26*cda5da8dSAndroid Build Coastguard Worker
27*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ('_callback', '_args', '_cancelled', '_loop',
28*cda5da8dSAndroid Build Coastguard Worker                 '_source_traceback', '_repr', '__weakref__',
29*cda5da8dSAndroid Build Coastguard Worker                 '_context')
30*cda5da8dSAndroid Build Coastguard Worker
31*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, callback, args, loop, context=None):
32*cda5da8dSAndroid Build Coastguard Worker        if context is None:
33*cda5da8dSAndroid Build Coastguard Worker            context = contextvars.copy_context()
34*cda5da8dSAndroid Build Coastguard Worker        self._context = context
35*cda5da8dSAndroid Build Coastguard Worker        self._loop = loop
36*cda5da8dSAndroid Build Coastguard Worker        self._callback = callback
37*cda5da8dSAndroid Build Coastguard Worker        self._args = args
38*cda5da8dSAndroid Build Coastguard Worker        self._cancelled = False
39*cda5da8dSAndroid Build Coastguard Worker        self._repr = None
40*cda5da8dSAndroid Build Coastguard Worker        if self._loop.get_debug():
41*cda5da8dSAndroid Build Coastguard Worker            self._source_traceback = format_helpers.extract_stack(
42*cda5da8dSAndroid Build Coastguard Worker                sys._getframe(1))
43*cda5da8dSAndroid Build Coastguard Worker        else:
44*cda5da8dSAndroid Build Coastguard Worker            self._source_traceback = None
45*cda5da8dSAndroid Build Coastguard Worker
46*cda5da8dSAndroid Build Coastguard Worker    def _repr_info(self):
47*cda5da8dSAndroid Build Coastguard Worker        info = [self.__class__.__name__]
48*cda5da8dSAndroid Build Coastguard Worker        if self._cancelled:
49*cda5da8dSAndroid Build Coastguard Worker            info.append('cancelled')
50*cda5da8dSAndroid Build Coastguard Worker        if self._callback is not None:
51*cda5da8dSAndroid Build Coastguard Worker            info.append(format_helpers._format_callback_source(
52*cda5da8dSAndroid Build Coastguard Worker                self._callback, self._args))
53*cda5da8dSAndroid Build Coastguard Worker        if self._source_traceback:
54*cda5da8dSAndroid Build Coastguard Worker            frame = self._source_traceback[-1]
55*cda5da8dSAndroid Build Coastguard Worker            info.append(f'created at {frame[0]}:{frame[1]}')
56*cda5da8dSAndroid Build Coastguard Worker        return info
57*cda5da8dSAndroid Build Coastguard Worker
58*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
59*cda5da8dSAndroid Build Coastguard Worker        if self._repr is not None:
60*cda5da8dSAndroid Build Coastguard Worker            return self._repr
61*cda5da8dSAndroid Build Coastguard Worker        info = self._repr_info()
62*cda5da8dSAndroid Build Coastguard Worker        return '<{}>'.format(' '.join(info))
63*cda5da8dSAndroid Build Coastguard Worker
64*cda5da8dSAndroid Build Coastguard Worker    def cancel(self):
65*cda5da8dSAndroid Build Coastguard Worker        if not self._cancelled:
66*cda5da8dSAndroid Build Coastguard Worker            self._cancelled = True
67*cda5da8dSAndroid Build Coastguard Worker            if self._loop.get_debug():
68*cda5da8dSAndroid Build Coastguard Worker                # Keep a representation in debug mode to keep callback and
69*cda5da8dSAndroid Build Coastguard Worker                # parameters. For example, to log the warning
70*cda5da8dSAndroid Build Coastguard Worker                # "Executing <Handle...> took 2.5 second"
71*cda5da8dSAndroid Build Coastguard Worker                self._repr = repr(self)
72*cda5da8dSAndroid Build Coastguard Worker            self._callback = None
73*cda5da8dSAndroid Build Coastguard Worker            self._args = None
74*cda5da8dSAndroid Build Coastguard Worker
75*cda5da8dSAndroid Build Coastguard Worker    def cancelled(self):
76*cda5da8dSAndroid Build Coastguard Worker        return self._cancelled
77*cda5da8dSAndroid Build Coastguard Worker
78*cda5da8dSAndroid Build Coastguard Worker    def _run(self):
79*cda5da8dSAndroid Build Coastguard Worker        try:
80*cda5da8dSAndroid Build Coastguard Worker            self._context.run(self._callback, *self._args)
81*cda5da8dSAndroid Build Coastguard Worker        except (SystemExit, KeyboardInterrupt):
82*cda5da8dSAndroid Build Coastguard Worker            raise
83*cda5da8dSAndroid Build Coastguard Worker        except BaseException as exc:
84*cda5da8dSAndroid Build Coastguard Worker            cb = format_helpers._format_callback_source(
85*cda5da8dSAndroid Build Coastguard Worker                self._callback, self._args)
86*cda5da8dSAndroid Build Coastguard Worker            msg = f'Exception in callback {cb}'
87*cda5da8dSAndroid Build Coastguard Worker            context = {
88*cda5da8dSAndroid Build Coastguard Worker                'message': msg,
89*cda5da8dSAndroid Build Coastguard Worker                'exception': exc,
90*cda5da8dSAndroid Build Coastguard Worker                'handle': self,
91*cda5da8dSAndroid Build Coastguard Worker            }
92*cda5da8dSAndroid Build Coastguard Worker            if self._source_traceback:
93*cda5da8dSAndroid Build Coastguard Worker                context['source_traceback'] = self._source_traceback
94*cda5da8dSAndroid Build Coastguard Worker            self._loop.call_exception_handler(context)
95*cda5da8dSAndroid Build Coastguard Worker        self = None  # Needed to break cycles when an exception occurs.
96*cda5da8dSAndroid Build Coastguard Worker
97*cda5da8dSAndroid Build Coastguard Worker
98*cda5da8dSAndroid Build Coastguard Workerclass TimerHandle(Handle):
99*cda5da8dSAndroid Build Coastguard Worker    """Object returned by timed callback registration methods."""
100*cda5da8dSAndroid Build Coastguard Worker
101*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ['_scheduled', '_when']
102*cda5da8dSAndroid Build Coastguard Worker
103*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, when, callback, args, loop, context=None):
104*cda5da8dSAndroid Build Coastguard Worker        super().__init__(callback, args, loop, context)
105*cda5da8dSAndroid Build Coastguard Worker        if self._source_traceback:
106*cda5da8dSAndroid Build Coastguard Worker            del self._source_traceback[-1]
107*cda5da8dSAndroid Build Coastguard Worker        self._when = when
108*cda5da8dSAndroid Build Coastguard Worker        self._scheduled = False
109*cda5da8dSAndroid Build Coastguard Worker
110*cda5da8dSAndroid Build Coastguard Worker    def _repr_info(self):
111*cda5da8dSAndroid Build Coastguard Worker        info = super()._repr_info()
112*cda5da8dSAndroid Build Coastguard Worker        pos = 2 if self._cancelled else 1
113*cda5da8dSAndroid Build Coastguard Worker        info.insert(pos, f'when={self._when}')
114*cda5da8dSAndroid Build Coastguard Worker        return info
115*cda5da8dSAndroid Build Coastguard Worker
116*cda5da8dSAndroid Build Coastguard Worker    def __hash__(self):
117*cda5da8dSAndroid Build Coastguard Worker        return hash(self._when)
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Worker    def __lt__(self, other):
120*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, TimerHandle):
121*cda5da8dSAndroid Build Coastguard Worker            return self._when < other._when
122*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
123*cda5da8dSAndroid Build Coastguard Worker
124*cda5da8dSAndroid Build Coastguard Worker    def __le__(self, other):
125*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, TimerHandle):
126*cda5da8dSAndroid Build Coastguard Worker            return self._when < other._when or self.__eq__(other)
127*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
128*cda5da8dSAndroid Build Coastguard Worker
129*cda5da8dSAndroid Build Coastguard Worker    def __gt__(self, other):
130*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, TimerHandle):
131*cda5da8dSAndroid Build Coastguard Worker            return self._when > other._when
132*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
133*cda5da8dSAndroid Build Coastguard Worker
134*cda5da8dSAndroid Build Coastguard Worker    def __ge__(self, other):
135*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, TimerHandle):
136*cda5da8dSAndroid Build Coastguard Worker            return self._when > other._when or self.__eq__(other)
137*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
138*cda5da8dSAndroid Build Coastguard Worker
139*cda5da8dSAndroid Build Coastguard Worker    def __eq__(self, other):
140*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, TimerHandle):
141*cda5da8dSAndroid Build Coastguard Worker            return (self._when == other._when and
142*cda5da8dSAndroid Build Coastguard Worker                    self._callback == other._callback and
143*cda5da8dSAndroid Build Coastguard Worker                    self._args == other._args and
144*cda5da8dSAndroid Build Coastguard Worker                    self._cancelled == other._cancelled)
145*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
146*cda5da8dSAndroid Build Coastguard Worker
147*cda5da8dSAndroid Build Coastguard Worker    def cancel(self):
148*cda5da8dSAndroid Build Coastguard Worker        if not self._cancelled:
149*cda5da8dSAndroid Build Coastguard Worker            self._loop._timer_handle_cancelled(self)
150*cda5da8dSAndroid Build Coastguard Worker        super().cancel()
151*cda5da8dSAndroid Build Coastguard Worker
152*cda5da8dSAndroid Build Coastguard Worker    def when(self):
153*cda5da8dSAndroid Build Coastguard Worker        """Return a scheduled callback time.
154*cda5da8dSAndroid Build Coastguard Worker
155*cda5da8dSAndroid Build Coastguard Worker        The time is an absolute timestamp, using the same time
156*cda5da8dSAndroid Build Coastguard Worker        reference as loop.time().
157*cda5da8dSAndroid Build Coastguard Worker        """
158*cda5da8dSAndroid Build Coastguard Worker        return self._when
159*cda5da8dSAndroid Build Coastguard Worker
160*cda5da8dSAndroid Build Coastguard Worker
161*cda5da8dSAndroid Build Coastguard Workerclass AbstractServer:
162*cda5da8dSAndroid Build Coastguard Worker    """Abstract server returned by create_server()."""
163*cda5da8dSAndroid Build Coastguard Worker
164*cda5da8dSAndroid Build Coastguard Worker    def close(self):
165*cda5da8dSAndroid Build Coastguard Worker        """Stop serving.  This leaves existing connections open."""
166*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
167*cda5da8dSAndroid Build Coastguard Worker
168*cda5da8dSAndroid Build Coastguard Worker    def get_loop(self):
169*cda5da8dSAndroid Build Coastguard Worker        """Get the event loop the Server object is attached to."""
170*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
171*cda5da8dSAndroid Build Coastguard Worker
172*cda5da8dSAndroid Build Coastguard Worker    def is_serving(self):
173*cda5da8dSAndroid Build Coastguard Worker        """Return True if the server is accepting connections."""
174*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
175*cda5da8dSAndroid Build Coastguard Worker
176*cda5da8dSAndroid Build Coastguard Worker    async def start_serving(self):
177*cda5da8dSAndroid Build Coastguard Worker        """Start accepting connections.
178*cda5da8dSAndroid Build Coastguard Worker
179*cda5da8dSAndroid Build Coastguard Worker        This method is idempotent, so it can be called when
180*cda5da8dSAndroid Build Coastguard Worker        the server is already being serving.
181*cda5da8dSAndroid Build Coastguard Worker        """
182*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
183*cda5da8dSAndroid Build Coastguard Worker
184*cda5da8dSAndroid Build Coastguard Worker    async def serve_forever(self):
185*cda5da8dSAndroid Build Coastguard Worker        """Start accepting connections until the coroutine is cancelled.
186*cda5da8dSAndroid Build Coastguard Worker
187*cda5da8dSAndroid Build Coastguard Worker        The server is closed when the coroutine is cancelled.
188*cda5da8dSAndroid Build Coastguard Worker        """
189*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
190*cda5da8dSAndroid Build Coastguard Worker
191*cda5da8dSAndroid Build Coastguard Worker    async def wait_closed(self):
192*cda5da8dSAndroid Build Coastguard Worker        """Coroutine to wait until service is closed."""
193*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
194*cda5da8dSAndroid Build Coastguard Worker
195*cda5da8dSAndroid Build Coastguard Worker    async def __aenter__(self):
196*cda5da8dSAndroid Build Coastguard Worker        return self
197*cda5da8dSAndroid Build Coastguard Worker
198*cda5da8dSAndroid Build Coastguard Worker    async def __aexit__(self, *exc):
199*cda5da8dSAndroid Build Coastguard Worker        self.close()
200*cda5da8dSAndroid Build Coastguard Worker        await self.wait_closed()
201*cda5da8dSAndroid Build Coastguard Worker
202*cda5da8dSAndroid Build Coastguard Worker
203*cda5da8dSAndroid Build Coastguard Workerclass AbstractEventLoop:
204*cda5da8dSAndroid Build Coastguard Worker    """Abstract event loop."""
205*cda5da8dSAndroid Build Coastguard Worker
206*cda5da8dSAndroid Build Coastguard Worker    # Running and stopping the event loop.
207*cda5da8dSAndroid Build Coastguard Worker
208*cda5da8dSAndroid Build Coastguard Worker    def run_forever(self):
209*cda5da8dSAndroid Build Coastguard Worker        """Run the event loop until stop() is called."""
210*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
211*cda5da8dSAndroid Build Coastguard Worker
212*cda5da8dSAndroid Build Coastguard Worker    def run_until_complete(self, future):
213*cda5da8dSAndroid Build Coastguard Worker        """Run the event loop until a Future is done.
214*cda5da8dSAndroid Build Coastguard Worker
215*cda5da8dSAndroid Build Coastguard Worker        Return the Future's result, or raise its exception.
216*cda5da8dSAndroid Build Coastguard Worker        """
217*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
218*cda5da8dSAndroid Build Coastguard Worker
219*cda5da8dSAndroid Build Coastguard Worker    def stop(self):
220*cda5da8dSAndroid Build Coastguard Worker        """Stop the event loop as soon as reasonable.
221*cda5da8dSAndroid Build Coastguard Worker
222*cda5da8dSAndroid Build Coastguard Worker        Exactly how soon that is may depend on the implementation, but
223*cda5da8dSAndroid Build Coastguard Worker        no more I/O callbacks should be scheduled.
224*cda5da8dSAndroid Build Coastguard Worker        """
225*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
226*cda5da8dSAndroid Build Coastguard Worker
227*cda5da8dSAndroid Build Coastguard Worker    def is_running(self):
228*cda5da8dSAndroid Build Coastguard Worker        """Return whether the event loop is currently running."""
229*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
230*cda5da8dSAndroid Build Coastguard Worker
231*cda5da8dSAndroid Build Coastguard Worker    def is_closed(self):
232*cda5da8dSAndroid Build Coastguard Worker        """Returns True if the event loop was closed."""
233*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
234*cda5da8dSAndroid Build Coastguard Worker
235*cda5da8dSAndroid Build Coastguard Worker    def close(self):
236*cda5da8dSAndroid Build Coastguard Worker        """Close the loop.
237*cda5da8dSAndroid Build Coastguard Worker
238*cda5da8dSAndroid Build Coastguard Worker        The loop should not be running.
239*cda5da8dSAndroid Build Coastguard Worker
240*cda5da8dSAndroid Build Coastguard Worker        This is idempotent and irreversible.
241*cda5da8dSAndroid Build Coastguard Worker
242*cda5da8dSAndroid Build Coastguard Worker        No other methods should be called after this one.
243*cda5da8dSAndroid Build Coastguard Worker        """
244*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
245*cda5da8dSAndroid Build Coastguard Worker
246*cda5da8dSAndroid Build Coastguard Worker    async def shutdown_asyncgens(self):
247*cda5da8dSAndroid Build Coastguard Worker        """Shutdown all active asynchronous generators."""
248*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
249*cda5da8dSAndroid Build Coastguard Worker
250*cda5da8dSAndroid Build Coastguard Worker    async def shutdown_default_executor(self):
251*cda5da8dSAndroid Build Coastguard Worker        """Schedule the shutdown of the default executor."""
252*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
253*cda5da8dSAndroid Build Coastguard Worker
254*cda5da8dSAndroid Build Coastguard Worker    # Methods scheduling callbacks.  All these return Handles.
255*cda5da8dSAndroid Build Coastguard Worker
256*cda5da8dSAndroid Build Coastguard Worker    def _timer_handle_cancelled(self, handle):
257*cda5da8dSAndroid Build Coastguard Worker        """Notification that a TimerHandle has been cancelled."""
258*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
259*cda5da8dSAndroid Build Coastguard Worker
260*cda5da8dSAndroid Build Coastguard Worker    def call_soon(self, callback, *args, context=None):
261*cda5da8dSAndroid Build Coastguard Worker        return self.call_later(0, callback, *args, context=context)
262*cda5da8dSAndroid Build Coastguard Worker
263*cda5da8dSAndroid Build Coastguard Worker    def call_later(self, delay, callback, *args, context=None):
264*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
265*cda5da8dSAndroid Build Coastguard Worker
266*cda5da8dSAndroid Build Coastguard Worker    def call_at(self, when, callback, *args, context=None):
267*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
268*cda5da8dSAndroid Build Coastguard Worker
269*cda5da8dSAndroid Build Coastguard Worker    def time(self):
270*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
271*cda5da8dSAndroid Build Coastguard Worker
272*cda5da8dSAndroid Build Coastguard Worker    def create_future(self):
273*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
274*cda5da8dSAndroid Build Coastguard Worker
275*cda5da8dSAndroid Build Coastguard Worker    # Method scheduling a coroutine object: create a task.
276*cda5da8dSAndroid Build Coastguard Worker
277*cda5da8dSAndroid Build Coastguard Worker    def create_task(self, coro, *, name=None, context=None):
278*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
279*cda5da8dSAndroid Build Coastguard Worker
280*cda5da8dSAndroid Build Coastguard Worker    # Methods for interacting with threads.
281*cda5da8dSAndroid Build Coastguard Worker
282*cda5da8dSAndroid Build Coastguard Worker    def call_soon_threadsafe(self, callback, *args, context=None):
283*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
284*cda5da8dSAndroid Build Coastguard Worker
285*cda5da8dSAndroid Build Coastguard Worker    def run_in_executor(self, executor, func, *args):
286*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
287*cda5da8dSAndroid Build Coastguard Worker
288*cda5da8dSAndroid Build Coastguard Worker    def set_default_executor(self, executor):
289*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
290*cda5da8dSAndroid Build Coastguard Worker
291*cda5da8dSAndroid Build Coastguard Worker    # Network I/O methods returning Futures.
292*cda5da8dSAndroid Build Coastguard Worker
293*cda5da8dSAndroid Build Coastguard Worker    async def getaddrinfo(self, host, port, *,
294*cda5da8dSAndroid Build Coastguard Worker                          family=0, type=0, proto=0, flags=0):
295*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
296*cda5da8dSAndroid Build Coastguard Worker
297*cda5da8dSAndroid Build Coastguard Worker    async def getnameinfo(self, sockaddr, flags=0):
298*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
299*cda5da8dSAndroid Build Coastguard Worker
300*cda5da8dSAndroid Build Coastguard Worker    async def create_connection(
301*cda5da8dSAndroid Build Coastguard Worker            self, protocol_factory, host=None, port=None,
302*cda5da8dSAndroid Build Coastguard Worker            *, ssl=None, family=0, proto=0,
303*cda5da8dSAndroid Build Coastguard Worker            flags=0, sock=None, local_addr=None,
304*cda5da8dSAndroid Build Coastguard Worker            server_hostname=None,
305*cda5da8dSAndroid Build Coastguard Worker            ssl_handshake_timeout=None,
306*cda5da8dSAndroid Build Coastguard Worker            ssl_shutdown_timeout=None,
307*cda5da8dSAndroid Build Coastguard Worker            happy_eyeballs_delay=None, interleave=None):
308*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
309*cda5da8dSAndroid Build Coastguard Worker
310*cda5da8dSAndroid Build Coastguard Worker    async def create_server(
311*cda5da8dSAndroid Build Coastguard Worker            self, protocol_factory, host=None, port=None,
312*cda5da8dSAndroid Build Coastguard Worker            *, family=socket.AF_UNSPEC,
313*cda5da8dSAndroid Build Coastguard Worker            flags=socket.AI_PASSIVE, sock=None, backlog=100,
314*cda5da8dSAndroid Build Coastguard Worker            ssl=None, reuse_address=None, reuse_port=None,
315*cda5da8dSAndroid Build Coastguard Worker            ssl_handshake_timeout=None,
316*cda5da8dSAndroid Build Coastguard Worker            ssl_shutdown_timeout=None,
317*cda5da8dSAndroid Build Coastguard Worker            start_serving=True):
318*cda5da8dSAndroid Build Coastguard Worker        """A coroutine which creates a TCP server bound to host and port.
319*cda5da8dSAndroid Build Coastguard Worker
320*cda5da8dSAndroid Build Coastguard Worker        The return value is a Server object which can be used to stop
321*cda5da8dSAndroid Build Coastguard Worker        the service.
322*cda5da8dSAndroid Build Coastguard Worker
323*cda5da8dSAndroid Build Coastguard Worker        If host is an empty string or None all interfaces are assumed
324*cda5da8dSAndroid Build Coastguard Worker        and a list of multiple sockets will be returned (most likely
325*cda5da8dSAndroid Build Coastguard Worker        one for IPv4 and another one for IPv6). The host parameter can also be
326*cda5da8dSAndroid Build Coastguard Worker        a sequence (e.g. list) of hosts to bind to.
327*cda5da8dSAndroid Build Coastguard Worker
328*cda5da8dSAndroid Build Coastguard Worker        family can be set to either AF_INET or AF_INET6 to force the
329*cda5da8dSAndroid Build Coastguard Worker        socket to use IPv4 or IPv6. If not set it will be determined
330*cda5da8dSAndroid Build Coastguard Worker        from host (defaults to AF_UNSPEC).
331*cda5da8dSAndroid Build Coastguard Worker
332*cda5da8dSAndroid Build Coastguard Worker        flags is a bitmask for getaddrinfo().
333*cda5da8dSAndroid Build Coastguard Worker
334*cda5da8dSAndroid Build Coastguard Worker        sock can optionally be specified in order to use a preexisting
335*cda5da8dSAndroid Build Coastguard Worker        socket object.
336*cda5da8dSAndroid Build Coastguard Worker
337*cda5da8dSAndroid Build Coastguard Worker        backlog is the maximum number of queued connections passed to
338*cda5da8dSAndroid Build Coastguard Worker        listen() (defaults to 100).
339*cda5da8dSAndroid Build Coastguard Worker
340*cda5da8dSAndroid Build Coastguard Worker        ssl can be set to an SSLContext to enable SSL over the
341*cda5da8dSAndroid Build Coastguard Worker        accepted connections.
342*cda5da8dSAndroid Build Coastguard Worker
343*cda5da8dSAndroid Build Coastguard Worker        reuse_address tells the kernel to reuse a local socket in
344*cda5da8dSAndroid Build Coastguard Worker        TIME_WAIT state, without waiting for its natural timeout to
345*cda5da8dSAndroid Build Coastguard Worker        expire. If not specified will automatically be set to True on
346*cda5da8dSAndroid Build Coastguard Worker        UNIX.
347*cda5da8dSAndroid Build Coastguard Worker
348*cda5da8dSAndroid Build Coastguard Worker        reuse_port tells the kernel to allow this endpoint to be bound to
349*cda5da8dSAndroid Build Coastguard Worker        the same port as other existing endpoints are bound to, so long as
350*cda5da8dSAndroid Build Coastguard Worker        they all set this flag when being created. This option is not
351*cda5da8dSAndroid Build Coastguard Worker        supported on Windows.
352*cda5da8dSAndroid Build Coastguard Worker
353*cda5da8dSAndroid Build Coastguard Worker        ssl_handshake_timeout is the time in seconds that an SSL server
354*cda5da8dSAndroid Build Coastguard Worker        will wait for completion of the SSL handshake before aborting the
355*cda5da8dSAndroid Build Coastguard Worker        connection. Default is 60s.
356*cda5da8dSAndroid Build Coastguard Worker
357*cda5da8dSAndroid Build Coastguard Worker        ssl_shutdown_timeout is the time in seconds that an SSL server
358*cda5da8dSAndroid Build Coastguard Worker        will wait for completion of the SSL shutdown procedure
359*cda5da8dSAndroid Build Coastguard Worker        before aborting the connection. Default is 30s.
360*cda5da8dSAndroid Build Coastguard Worker
361*cda5da8dSAndroid Build Coastguard Worker        start_serving set to True (default) causes the created server
362*cda5da8dSAndroid Build Coastguard Worker        to start accepting connections immediately.  When set to False,
363*cda5da8dSAndroid Build Coastguard Worker        the user should await Server.start_serving() or Server.serve_forever()
364*cda5da8dSAndroid Build Coastguard Worker        to make the server to start accepting connections.
365*cda5da8dSAndroid Build Coastguard Worker        """
366*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
367*cda5da8dSAndroid Build Coastguard Worker
368*cda5da8dSAndroid Build Coastguard Worker    async def sendfile(self, transport, file, offset=0, count=None,
369*cda5da8dSAndroid Build Coastguard Worker                       *, fallback=True):
370*cda5da8dSAndroid Build Coastguard Worker        """Send a file through a transport.
371*cda5da8dSAndroid Build Coastguard Worker
372*cda5da8dSAndroid Build Coastguard Worker        Return an amount of sent bytes.
373*cda5da8dSAndroid Build Coastguard Worker        """
374*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
375*cda5da8dSAndroid Build Coastguard Worker
376*cda5da8dSAndroid Build Coastguard Worker    async def start_tls(self, transport, protocol, sslcontext, *,
377*cda5da8dSAndroid Build Coastguard Worker                        server_side=False,
378*cda5da8dSAndroid Build Coastguard Worker                        server_hostname=None,
379*cda5da8dSAndroid Build Coastguard Worker                        ssl_handshake_timeout=None,
380*cda5da8dSAndroid Build Coastguard Worker                        ssl_shutdown_timeout=None):
381*cda5da8dSAndroid Build Coastguard Worker        """Upgrade a transport to TLS.
382*cda5da8dSAndroid Build Coastguard Worker
383*cda5da8dSAndroid Build Coastguard Worker        Return a new transport that *protocol* should start using
384*cda5da8dSAndroid Build Coastguard Worker        immediately.
385*cda5da8dSAndroid Build Coastguard Worker        """
386*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
387*cda5da8dSAndroid Build Coastguard Worker
388*cda5da8dSAndroid Build Coastguard Worker    async def create_unix_connection(
389*cda5da8dSAndroid Build Coastguard Worker            self, protocol_factory, path=None, *,
390*cda5da8dSAndroid Build Coastguard Worker            ssl=None, sock=None,
391*cda5da8dSAndroid Build Coastguard Worker            server_hostname=None,
392*cda5da8dSAndroid Build Coastguard Worker            ssl_handshake_timeout=None,
393*cda5da8dSAndroid Build Coastguard Worker            ssl_shutdown_timeout=None):
394*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
395*cda5da8dSAndroid Build Coastguard Worker
396*cda5da8dSAndroid Build Coastguard Worker    async def create_unix_server(
397*cda5da8dSAndroid Build Coastguard Worker            self, protocol_factory, path=None, *,
398*cda5da8dSAndroid Build Coastguard Worker            sock=None, backlog=100, ssl=None,
399*cda5da8dSAndroid Build Coastguard Worker            ssl_handshake_timeout=None,
400*cda5da8dSAndroid Build Coastguard Worker            ssl_shutdown_timeout=None,
401*cda5da8dSAndroid Build Coastguard Worker            start_serving=True):
402*cda5da8dSAndroid Build Coastguard Worker        """A coroutine which creates a UNIX Domain Socket server.
403*cda5da8dSAndroid Build Coastguard Worker
404*cda5da8dSAndroid Build Coastguard Worker        The return value is a Server object, which can be used to stop
405*cda5da8dSAndroid Build Coastguard Worker        the service.
406*cda5da8dSAndroid Build Coastguard Worker
407*cda5da8dSAndroid Build Coastguard Worker        path is a str, representing a file system path to bind the
408*cda5da8dSAndroid Build Coastguard Worker        server socket to.
409*cda5da8dSAndroid Build Coastguard Worker
410*cda5da8dSAndroid Build Coastguard Worker        sock can optionally be specified in order to use a preexisting
411*cda5da8dSAndroid Build Coastguard Worker        socket object.
412*cda5da8dSAndroid Build Coastguard Worker
413*cda5da8dSAndroid Build Coastguard Worker        backlog is the maximum number of queued connections passed to
414*cda5da8dSAndroid Build Coastguard Worker        listen() (defaults to 100).
415*cda5da8dSAndroid Build Coastguard Worker
416*cda5da8dSAndroid Build Coastguard Worker        ssl can be set to an SSLContext to enable SSL over the
417*cda5da8dSAndroid Build Coastguard Worker        accepted connections.
418*cda5da8dSAndroid Build Coastguard Worker
419*cda5da8dSAndroid Build Coastguard Worker        ssl_handshake_timeout is the time in seconds that an SSL server
420*cda5da8dSAndroid Build Coastguard Worker        will wait for the SSL handshake to complete (defaults to 60s).
421*cda5da8dSAndroid Build Coastguard Worker
422*cda5da8dSAndroid Build Coastguard Worker        ssl_shutdown_timeout is the time in seconds that an SSL server
423*cda5da8dSAndroid Build Coastguard Worker        will wait for the SSL shutdown to finish (defaults to 30s).
424*cda5da8dSAndroid Build Coastguard Worker
425*cda5da8dSAndroid Build Coastguard Worker        start_serving set to True (default) causes the created server
426*cda5da8dSAndroid Build Coastguard Worker        to start accepting connections immediately.  When set to False,
427*cda5da8dSAndroid Build Coastguard Worker        the user should await Server.start_serving() or Server.serve_forever()
428*cda5da8dSAndroid Build Coastguard Worker        to make the server to start accepting connections.
429*cda5da8dSAndroid Build Coastguard Worker        """
430*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
431*cda5da8dSAndroid Build Coastguard Worker
432*cda5da8dSAndroid Build Coastguard Worker    async def connect_accepted_socket(
433*cda5da8dSAndroid Build Coastguard Worker            self, protocol_factory, sock,
434*cda5da8dSAndroid Build Coastguard Worker            *, ssl=None,
435*cda5da8dSAndroid Build Coastguard Worker            ssl_handshake_timeout=None,
436*cda5da8dSAndroid Build Coastguard Worker            ssl_shutdown_timeout=None):
437*cda5da8dSAndroid Build Coastguard Worker        """Handle an accepted connection.
438*cda5da8dSAndroid Build Coastguard Worker
439*cda5da8dSAndroid Build Coastguard Worker        This is used by servers that accept connections outside of
440*cda5da8dSAndroid Build Coastguard Worker        asyncio, but use asyncio to handle connections.
441*cda5da8dSAndroid Build Coastguard Worker
442*cda5da8dSAndroid Build Coastguard Worker        This method is a coroutine.  When completed, the coroutine
443*cda5da8dSAndroid Build Coastguard Worker        returns a (transport, protocol) pair.
444*cda5da8dSAndroid Build Coastguard Worker        """
445*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
446*cda5da8dSAndroid Build Coastguard Worker
447*cda5da8dSAndroid Build Coastguard Worker    async def create_datagram_endpoint(self, protocol_factory,
448*cda5da8dSAndroid Build Coastguard Worker                                       local_addr=None, remote_addr=None, *,
449*cda5da8dSAndroid Build Coastguard Worker                                       family=0, proto=0, flags=0,
450*cda5da8dSAndroid Build Coastguard Worker                                       reuse_address=None, reuse_port=None,
451*cda5da8dSAndroid Build Coastguard Worker                                       allow_broadcast=None, sock=None):
452*cda5da8dSAndroid Build Coastguard Worker        """A coroutine which creates a datagram endpoint.
453*cda5da8dSAndroid Build Coastguard Worker
454*cda5da8dSAndroid Build Coastguard Worker        This method will try to establish the endpoint in the background.
455*cda5da8dSAndroid Build Coastguard Worker        When successful, the coroutine returns a (transport, protocol) pair.
456*cda5da8dSAndroid Build Coastguard Worker
457*cda5da8dSAndroid Build Coastguard Worker        protocol_factory must be a callable returning a protocol instance.
458*cda5da8dSAndroid Build Coastguard Worker
459*cda5da8dSAndroid Build Coastguard Worker        socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on
460*cda5da8dSAndroid Build Coastguard Worker        host (or family if specified), socket type SOCK_DGRAM.
461*cda5da8dSAndroid Build Coastguard Worker
462*cda5da8dSAndroid Build Coastguard Worker        reuse_address tells the kernel to reuse a local socket in
463*cda5da8dSAndroid Build Coastguard Worker        TIME_WAIT state, without waiting for its natural timeout to
464*cda5da8dSAndroid Build Coastguard Worker        expire. If not specified it will automatically be set to True on
465*cda5da8dSAndroid Build Coastguard Worker        UNIX.
466*cda5da8dSAndroid Build Coastguard Worker
467*cda5da8dSAndroid Build Coastguard Worker        reuse_port tells the kernel to allow this endpoint to be bound to
468*cda5da8dSAndroid Build Coastguard Worker        the same port as other existing endpoints are bound to, so long as
469*cda5da8dSAndroid Build Coastguard Worker        they all set this flag when being created. This option is not
470*cda5da8dSAndroid Build Coastguard Worker        supported on Windows and some UNIX's. If the
471*cda5da8dSAndroid Build Coastguard Worker        :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
472*cda5da8dSAndroid Build Coastguard Worker        capability is unsupported.
473*cda5da8dSAndroid Build Coastguard Worker
474*cda5da8dSAndroid Build Coastguard Worker        allow_broadcast tells the kernel to allow this endpoint to send
475*cda5da8dSAndroid Build Coastguard Worker        messages to the broadcast address.
476*cda5da8dSAndroid Build Coastguard Worker
477*cda5da8dSAndroid Build Coastguard Worker        sock can optionally be specified in order to use a preexisting
478*cda5da8dSAndroid Build Coastguard Worker        socket object.
479*cda5da8dSAndroid Build Coastguard Worker        """
480*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
481*cda5da8dSAndroid Build Coastguard Worker
482*cda5da8dSAndroid Build Coastguard Worker    # Pipes and subprocesses.
483*cda5da8dSAndroid Build Coastguard Worker
484*cda5da8dSAndroid Build Coastguard Worker    async def connect_read_pipe(self, protocol_factory, pipe):
485*cda5da8dSAndroid Build Coastguard Worker        """Register read pipe in event loop. Set the pipe to non-blocking mode.
486*cda5da8dSAndroid Build Coastguard Worker
487*cda5da8dSAndroid Build Coastguard Worker        protocol_factory should instantiate object with Protocol interface.
488*cda5da8dSAndroid Build Coastguard Worker        pipe is a file-like object.
489*cda5da8dSAndroid Build Coastguard Worker        Return pair (transport, protocol), where transport supports the
490*cda5da8dSAndroid Build Coastguard Worker        ReadTransport interface."""
491*cda5da8dSAndroid Build Coastguard Worker        # The reason to accept file-like object instead of just file descriptor
492*cda5da8dSAndroid Build Coastguard Worker        # is: we need to own pipe and close it at transport finishing
493*cda5da8dSAndroid Build Coastguard Worker        # Can got complicated errors if pass f.fileno(),
494*cda5da8dSAndroid Build Coastguard Worker        # close fd in pipe transport then close f and vice versa.
495*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
496*cda5da8dSAndroid Build Coastguard Worker
497*cda5da8dSAndroid Build Coastguard Worker    async def connect_write_pipe(self, protocol_factory, pipe):
498*cda5da8dSAndroid Build Coastguard Worker        """Register write pipe in event loop.
499*cda5da8dSAndroid Build Coastguard Worker
500*cda5da8dSAndroid Build Coastguard Worker        protocol_factory should instantiate object with BaseProtocol interface.
501*cda5da8dSAndroid Build Coastguard Worker        Pipe is file-like object already switched to nonblocking.
502*cda5da8dSAndroid Build Coastguard Worker        Return pair (transport, protocol), where transport support
503*cda5da8dSAndroid Build Coastguard Worker        WriteTransport interface."""
504*cda5da8dSAndroid Build Coastguard Worker        # The reason to accept file-like object instead of just file descriptor
505*cda5da8dSAndroid Build Coastguard Worker        # is: we need to own pipe and close it at transport finishing
506*cda5da8dSAndroid Build Coastguard Worker        # Can got complicated errors if pass f.fileno(),
507*cda5da8dSAndroid Build Coastguard Worker        # close fd in pipe transport then close f and vice versa.
508*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
509*cda5da8dSAndroid Build Coastguard Worker
510*cda5da8dSAndroid Build Coastguard Worker    async def subprocess_shell(self, protocol_factory, cmd, *,
511*cda5da8dSAndroid Build Coastguard Worker                               stdin=subprocess.PIPE,
512*cda5da8dSAndroid Build Coastguard Worker                               stdout=subprocess.PIPE,
513*cda5da8dSAndroid Build Coastguard Worker                               stderr=subprocess.PIPE,
514*cda5da8dSAndroid Build Coastguard Worker                               **kwargs):
515*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
516*cda5da8dSAndroid Build Coastguard Worker
517*cda5da8dSAndroid Build Coastguard Worker    async def subprocess_exec(self, protocol_factory, *args,
518*cda5da8dSAndroid Build Coastguard Worker                              stdin=subprocess.PIPE,
519*cda5da8dSAndroid Build Coastguard Worker                              stdout=subprocess.PIPE,
520*cda5da8dSAndroid Build Coastguard Worker                              stderr=subprocess.PIPE,
521*cda5da8dSAndroid Build Coastguard Worker                              **kwargs):
522*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
523*cda5da8dSAndroid Build Coastguard Worker
524*cda5da8dSAndroid Build Coastguard Worker    # Ready-based callback registration methods.
525*cda5da8dSAndroid Build Coastguard Worker    # The add_*() methods return None.
526*cda5da8dSAndroid Build Coastguard Worker    # The remove_*() methods return True if something was removed,
527*cda5da8dSAndroid Build Coastguard Worker    # False if there was nothing to delete.
528*cda5da8dSAndroid Build Coastguard Worker
529*cda5da8dSAndroid Build Coastguard Worker    def add_reader(self, fd, callback, *args):
530*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
531*cda5da8dSAndroid Build Coastguard Worker
532*cda5da8dSAndroid Build Coastguard Worker    def remove_reader(self, fd):
533*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
534*cda5da8dSAndroid Build Coastguard Worker
535*cda5da8dSAndroid Build Coastguard Worker    def add_writer(self, fd, callback, *args):
536*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
537*cda5da8dSAndroid Build Coastguard Worker
538*cda5da8dSAndroid Build Coastguard Worker    def remove_writer(self, fd):
539*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
540*cda5da8dSAndroid Build Coastguard Worker
541*cda5da8dSAndroid Build Coastguard Worker    # Completion based I/O methods returning Futures.
542*cda5da8dSAndroid Build Coastguard Worker
543*cda5da8dSAndroid Build Coastguard Worker    async def sock_recv(self, sock, nbytes):
544*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
545*cda5da8dSAndroid Build Coastguard Worker
546*cda5da8dSAndroid Build Coastguard Worker    async def sock_recv_into(self, sock, buf):
547*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
548*cda5da8dSAndroid Build Coastguard Worker
549*cda5da8dSAndroid Build Coastguard Worker    async def sock_recvfrom(self, sock, bufsize):
550*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
551*cda5da8dSAndroid Build Coastguard Worker
552*cda5da8dSAndroid Build Coastguard Worker    async def sock_recvfrom_into(self, sock, buf, nbytes=0):
553*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
554*cda5da8dSAndroid Build Coastguard Worker
555*cda5da8dSAndroid Build Coastguard Worker    async def sock_sendall(self, sock, data):
556*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
557*cda5da8dSAndroid Build Coastguard Worker
558*cda5da8dSAndroid Build Coastguard Worker    async def sock_sendto(self, sock, data, address):
559*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
560*cda5da8dSAndroid Build Coastguard Worker
561*cda5da8dSAndroid Build Coastguard Worker    async def sock_connect(self, sock, address):
562*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
563*cda5da8dSAndroid Build Coastguard Worker
564*cda5da8dSAndroid Build Coastguard Worker    async def sock_accept(self, sock):
565*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
566*cda5da8dSAndroid Build Coastguard Worker
567*cda5da8dSAndroid Build Coastguard Worker    async def sock_sendfile(self, sock, file, offset=0, count=None,
568*cda5da8dSAndroid Build Coastguard Worker                            *, fallback=None):
569*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
570*cda5da8dSAndroid Build Coastguard Worker
571*cda5da8dSAndroid Build Coastguard Worker    # Signal handling.
572*cda5da8dSAndroid Build Coastguard Worker
573*cda5da8dSAndroid Build Coastguard Worker    def add_signal_handler(self, sig, callback, *args):
574*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
575*cda5da8dSAndroid Build Coastguard Worker
576*cda5da8dSAndroid Build Coastguard Worker    def remove_signal_handler(self, sig):
577*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
578*cda5da8dSAndroid Build Coastguard Worker
579*cda5da8dSAndroid Build Coastguard Worker    # Task factory.
580*cda5da8dSAndroid Build Coastguard Worker
581*cda5da8dSAndroid Build Coastguard Worker    def set_task_factory(self, factory):
582*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
583*cda5da8dSAndroid Build Coastguard Worker
584*cda5da8dSAndroid Build Coastguard Worker    def get_task_factory(self):
585*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
586*cda5da8dSAndroid Build Coastguard Worker
587*cda5da8dSAndroid Build Coastguard Worker    # Error handlers.
588*cda5da8dSAndroid Build Coastguard Worker
589*cda5da8dSAndroid Build Coastguard Worker    def get_exception_handler(self):
590*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
591*cda5da8dSAndroid Build Coastguard Worker
592*cda5da8dSAndroid Build Coastguard Worker    def set_exception_handler(self, handler):
593*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
594*cda5da8dSAndroid Build Coastguard Worker
595*cda5da8dSAndroid Build Coastguard Worker    def default_exception_handler(self, context):
596*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
597*cda5da8dSAndroid Build Coastguard Worker
598*cda5da8dSAndroid Build Coastguard Worker    def call_exception_handler(self, context):
599*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
600*cda5da8dSAndroid Build Coastguard Worker
601*cda5da8dSAndroid Build Coastguard Worker    # Debug flag management.
602*cda5da8dSAndroid Build Coastguard Worker
603*cda5da8dSAndroid Build Coastguard Worker    def get_debug(self):
604*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
605*cda5da8dSAndroid Build Coastguard Worker
606*cda5da8dSAndroid Build Coastguard Worker    def set_debug(self, enabled):
607*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
608*cda5da8dSAndroid Build Coastguard Worker
609*cda5da8dSAndroid Build Coastguard Worker
610*cda5da8dSAndroid Build Coastguard Workerclass AbstractEventLoopPolicy:
611*cda5da8dSAndroid Build Coastguard Worker    """Abstract policy for accessing the event loop."""
612*cda5da8dSAndroid Build Coastguard Worker
613*cda5da8dSAndroid Build Coastguard Worker    def get_event_loop(self):
614*cda5da8dSAndroid Build Coastguard Worker        """Get the event loop for the current context.
615*cda5da8dSAndroid Build Coastguard Worker
616*cda5da8dSAndroid Build Coastguard Worker        Returns an event loop object implementing the BaseEventLoop interface,
617*cda5da8dSAndroid Build Coastguard Worker        or raises an exception in case no event loop has been set for the
618*cda5da8dSAndroid Build Coastguard Worker        current context and the current policy does not specify to create one.
619*cda5da8dSAndroid Build Coastguard Worker
620*cda5da8dSAndroid Build Coastguard Worker        It should never return None."""
621*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
622*cda5da8dSAndroid Build Coastguard Worker
623*cda5da8dSAndroid Build Coastguard Worker    def set_event_loop(self, loop):
624*cda5da8dSAndroid Build Coastguard Worker        """Set the event loop for the current context to loop."""
625*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
626*cda5da8dSAndroid Build Coastguard Worker
627*cda5da8dSAndroid Build Coastguard Worker    def new_event_loop(self):
628*cda5da8dSAndroid Build Coastguard Worker        """Create and return a new event loop object according to this
629*cda5da8dSAndroid Build Coastguard Worker        policy's rules. If there's need to set this loop as the event loop for
630*cda5da8dSAndroid Build Coastguard Worker        the current context, set_event_loop must be called explicitly."""
631*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
632*cda5da8dSAndroid Build Coastguard Worker
633*cda5da8dSAndroid Build Coastguard Worker    # Child processes handling (Unix only).
634*cda5da8dSAndroid Build Coastguard Worker
635*cda5da8dSAndroid Build Coastguard Worker    def get_child_watcher(self):
636*cda5da8dSAndroid Build Coastguard Worker        "Get the watcher for child processes."
637*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
638*cda5da8dSAndroid Build Coastguard Worker
639*cda5da8dSAndroid Build Coastguard Worker    def set_child_watcher(self, watcher):
640*cda5da8dSAndroid Build Coastguard Worker        """Set the watcher for child processes."""
641*cda5da8dSAndroid Build Coastguard Worker        raise NotImplementedError
642*cda5da8dSAndroid Build Coastguard Worker
643*cda5da8dSAndroid Build Coastguard Worker
644*cda5da8dSAndroid Build Coastguard Workerclass BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
645*cda5da8dSAndroid Build Coastguard Worker    """Default policy implementation for accessing the event loop.
646*cda5da8dSAndroid Build Coastguard Worker
647*cda5da8dSAndroid Build Coastguard Worker    In this policy, each thread has its own event loop.  However, we
648*cda5da8dSAndroid Build Coastguard Worker    only automatically create an event loop by default for the main
649*cda5da8dSAndroid Build Coastguard Worker    thread; other threads by default have no event loop.
650*cda5da8dSAndroid Build Coastguard Worker
651*cda5da8dSAndroid Build Coastguard Worker    Other policies may have different rules (e.g. a single global
652*cda5da8dSAndroid Build Coastguard Worker    event loop, or automatically creating an event loop per thread, or
653*cda5da8dSAndroid Build Coastguard Worker    using some other notion of context to which an event loop is
654*cda5da8dSAndroid Build Coastguard Worker    associated).
655*cda5da8dSAndroid Build Coastguard Worker    """
656*cda5da8dSAndroid Build Coastguard Worker
657*cda5da8dSAndroid Build Coastguard Worker    _loop_factory = None
658*cda5da8dSAndroid Build Coastguard Worker
659*cda5da8dSAndroid Build Coastguard Worker    class _Local(threading.local):
660*cda5da8dSAndroid Build Coastguard Worker        _loop = None
661*cda5da8dSAndroid Build Coastguard Worker        _set_called = False
662*cda5da8dSAndroid Build Coastguard Worker
663*cda5da8dSAndroid Build Coastguard Worker    def __init__(self):
664*cda5da8dSAndroid Build Coastguard Worker        self._local = self._Local()
665*cda5da8dSAndroid Build Coastguard Worker
666*cda5da8dSAndroid Build Coastguard Worker    def get_event_loop(self):
667*cda5da8dSAndroid Build Coastguard Worker        """Get the event loop for the current context.
668*cda5da8dSAndroid Build Coastguard Worker
669*cda5da8dSAndroid Build Coastguard Worker        Returns an instance of EventLoop or raises an exception.
670*cda5da8dSAndroid Build Coastguard Worker        """
671*cda5da8dSAndroid Build Coastguard Worker        if (self._local._loop is None and
672*cda5da8dSAndroid Build Coastguard Worker                not self._local._set_called and
673*cda5da8dSAndroid Build Coastguard Worker                threading.current_thread() is threading.main_thread()):
674*cda5da8dSAndroid Build Coastguard Worker            self.set_event_loop(self.new_event_loop())
675*cda5da8dSAndroid Build Coastguard Worker
676*cda5da8dSAndroid Build Coastguard Worker        if self._local._loop is None:
677*cda5da8dSAndroid Build Coastguard Worker            raise RuntimeError('There is no current event loop in thread %r.'
678*cda5da8dSAndroid Build Coastguard Worker                               % threading.current_thread().name)
679*cda5da8dSAndroid Build Coastguard Worker
680*cda5da8dSAndroid Build Coastguard Worker        return self._local._loop
681*cda5da8dSAndroid Build Coastguard Worker
682*cda5da8dSAndroid Build Coastguard Worker    def set_event_loop(self, loop):
683*cda5da8dSAndroid Build Coastguard Worker        """Set the event loop."""
684*cda5da8dSAndroid Build Coastguard Worker        self._local._set_called = True
685*cda5da8dSAndroid Build Coastguard Worker        if loop is not None and not isinstance(loop, AbstractEventLoop):
686*cda5da8dSAndroid Build Coastguard Worker            raise TypeError(f"loop must be an instance of AbstractEventLoop or None, not '{type(loop).__name__}'")
687*cda5da8dSAndroid Build Coastguard Worker        self._local._loop = loop
688*cda5da8dSAndroid Build Coastguard Worker
689*cda5da8dSAndroid Build Coastguard Worker    def new_event_loop(self):
690*cda5da8dSAndroid Build Coastguard Worker        """Create a new event loop.
691*cda5da8dSAndroid Build Coastguard Worker
692*cda5da8dSAndroid Build Coastguard Worker        You must call set_event_loop() to make this the current event
693*cda5da8dSAndroid Build Coastguard Worker        loop.
694*cda5da8dSAndroid Build Coastguard Worker        """
695*cda5da8dSAndroid Build Coastguard Worker        return self._loop_factory()
696*cda5da8dSAndroid Build Coastguard Worker
697*cda5da8dSAndroid Build Coastguard Worker
698*cda5da8dSAndroid Build Coastguard Worker# Event loop policy.  The policy itself is always global, even if the
699*cda5da8dSAndroid Build Coastguard Worker# policy's rules say that there is an event loop per thread (or other
700*cda5da8dSAndroid Build Coastguard Worker# notion of context).  The default policy is installed by the first
701*cda5da8dSAndroid Build Coastguard Worker# call to get_event_loop_policy().
702*cda5da8dSAndroid Build Coastguard Worker_event_loop_policy = None
703*cda5da8dSAndroid Build Coastguard Worker
704*cda5da8dSAndroid Build Coastguard Worker# Lock for protecting the on-the-fly creation of the event loop policy.
705*cda5da8dSAndroid Build Coastguard Worker_lock = threading.Lock()
706*cda5da8dSAndroid Build Coastguard Worker
707*cda5da8dSAndroid Build Coastguard Worker
708*cda5da8dSAndroid Build Coastguard Worker# A TLS for the running event loop, used by _get_running_loop.
709*cda5da8dSAndroid Build Coastguard Workerclass _RunningLoop(threading.local):
710*cda5da8dSAndroid Build Coastguard Worker    loop_pid = (None, None)
711*cda5da8dSAndroid Build Coastguard Worker
712*cda5da8dSAndroid Build Coastguard Worker
713*cda5da8dSAndroid Build Coastguard Worker_running_loop = _RunningLoop()
714*cda5da8dSAndroid Build Coastguard Worker
715*cda5da8dSAndroid Build Coastguard Worker
716*cda5da8dSAndroid Build Coastguard Workerdef get_running_loop():
717*cda5da8dSAndroid Build Coastguard Worker    """Return the running event loop.  Raise a RuntimeError if there is none.
718*cda5da8dSAndroid Build Coastguard Worker
719*cda5da8dSAndroid Build Coastguard Worker    This function is thread-specific.
720*cda5da8dSAndroid Build Coastguard Worker    """
721*cda5da8dSAndroid Build Coastguard Worker    # NOTE: this function is implemented in C (see _asynciomodule.c)
722*cda5da8dSAndroid Build Coastguard Worker    loop = _get_running_loop()
723*cda5da8dSAndroid Build Coastguard Worker    if loop is None:
724*cda5da8dSAndroid Build Coastguard Worker        raise RuntimeError('no running event loop')
725*cda5da8dSAndroid Build Coastguard Worker    return loop
726*cda5da8dSAndroid Build Coastguard Worker
727*cda5da8dSAndroid Build Coastguard Worker
728*cda5da8dSAndroid Build Coastguard Workerdef _get_running_loop():
729*cda5da8dSAndroid Build Coastguard Worker    """Return the running event loop or None.
730*cda5da8dSAndroid Build Coastguard Worker
731*cda5da8dSAndroid Build Coastguard Worker    This is a low-level function intended to be used by event loops.
732*cda5da8dSAndroid Build Coastguard Worker    This function is thread-specific.
733*cda5da8dSAndroid Build Coastguard Worker    """
734*cda5da8dSAndroid Build Coastguard Worker    # NOTE: this function is implemented in C (see _asynciomodule.c)
735*cda5da8dSAndroid Build Coastguard Worker    running_loop, pid = _running_loop.loop_pid
736*cda5da8dSAndroid Build Coastguard Worker    if running_loop is not None and pid == os.getpid():
737*cda5da8dSAndroid Build Coastguard Worker        return running_loop
738*cda5da8dSAndroid Build Coastguard Worker
739*cda5da8dSAndroid Build Coastguard Worker
740*cda5da8dSAndroid Build Coastguard Workerdef _set_running_loop(loop):
741*cda5da8dSAndroid Build Coastguard Worker    """Set the running event loop.
742*cda5da8dSAndroid Build Coastguard Worker
743*cda5da8dSAndroid Build Coastguard Worker    This is a low-level function intended to be used by event loops.
744*cda5da8dSAndroid Build Coastguard Worker    This function is thread-specific.
745*cda5da8dSAndroid Build Coastguard Worker    """
746*cda5da8dSAndroid Build Coastguard Worker    # NOTE: this function is implemented in C (see _asynciomodule.c)
747*cda5da8dSAndroid Build Coastguard Worker    _running_loop.loop_pid = (loop, os.getpid())
748*cda5da8dSAndroid Build Coastguard Worker
749*cda5da8dSAndroid Build Coastguard Worker
750*cda5da8dSAndroid Build Coastguard Workerdef _init_event_loop_policy():
751*cda5da8dSAndroid Build Coastguard Worker    global _event_loop_policy
752*cda5da8dSAndroid Build Coastguard Worker    with _lock:
753*cda5da8dSAndroid Build Coastguard Worker        if _event_loop_policy is None:  # pragma: no branch
754*cda5da8dSAndroid Build Coastguard Worker            from . import DefaultEventLoopPolicy
755*cda5da8dSAndroid Build Coastguard Worker            _event_loop_policy = DefaultEventLoopPolicy()
756*cda5da8dSAndroid Build Coastguard Worker
757*cda5da8dSAndroid Build Coastguard Worker
758*cda5da8dSAndroid Build Coastguard Workerdef get_event_loop_policy():
759*cda5da8dSAndroid Build Coastguard Worker    """Get the current event loop policy."""
760*cda5da8dSAndroid Build Coastguard Worker    if _event_loop_policy is None:
761*cda5da8dSAndroid Build Coastguard Worker        _init_event_loop_policy()
762*cda5da8dSAndroid Build Coastguard Worker    return _event_loop_policy
763*cda5da8dSAndroid Build Coastguard Worker
764*cda5da8dSAndroid Build Coastguard Worker
765*cda5da8dSAndroid Build Coastguard Workerdef set_event_loop_policy(policy):
766*cda5da8dSAndroid Build Coastguard Worker    """Set the current event loop policy.
767*cda5da8dSAndroid Build Coastguard Worker
768*cda5da8dSAndroid Build Coastguard Worker    If policy is None, the default policy is restored."""
769*cda5da8dSAndroid Build Coastguard Worker    global _event_loop_policy
770*cda5da8dSAndroid Build Coastguard Worker    if policy is not None and not isinstance(policy, AbstractEventLoopPolicy):
771*cda5da8dSAndroid Build Coastguard Worker        raise TypeError(f"policy must be an instance of AbstractEventLoopPolicy or None, not '{type(policy).__name__}'")
772*cda5da8dSAndroid Build Coastguard Worker    _event_loop_policy = policy
773*cda5da8dSAndroid Build Coastguard Worker
774*cda5da8dSAndroid Build Coastguard Worker
775*cda5da8dSAndroid Build Coastguard Workerdef get_event_loop():
776*cda5da8dSAndroid Build Coastguard Worker    """Return an asyncio event loop.
777*cda5da8dSAndroid Build Coastguard Worker
778*cda5da8dSAndroid Build Coastguard Worker    When called from a coroutine or a callback (e.g. scheduled with call_soon
779*cda5da8dSAndroid Build Coastguard Worker    or similar API), this function will always return the running event loop.
780*cda5da8dSAndroid Build Coastguard Worker
781*cda5da8dSAndroid Build Coastguard Worker    If there is no running event loop set, the function will return
782*cda5da8dSAndroid Build Coastguard Worker    the result of `get_event_loop_policy().get_event_loop()` call.
783*cda5da8dSAndroid Build Coastguard Worker    """
784*cda5da8dSAndroid Build Coastguard Worker    # NOTE: this function is implemented in C (see _asynciomodule.c)
785*cda5da8dSAndroid Build Coastguard Worker    return _py__get_event_loop()
786*cda5da8dSAndroid Build Coastguard Worker
787*cda5da8dSAndroid Build Coastguard Worker
788*cda5da8dSAndroid Build Coastguard Workerdef _get_event_loop(stacklevel=3):
789*cda5da8dSAndroid Build Coastguard Worker    # This internal method is going away in Python 3.12, left here only for
790*cda5da8dSAndroid Build Coastguard Worker    # backwards compatibility with 3.10.0 - 3.10.8 and 3.11.0.
791*cda5da8dSAndroid Build Coastguard Worker    # Similarly, this method's C equivalent in _asyncio is going away as well.
792*cda5da8dSAndroid Build Coastguard Worker    # See GH-99949 for more details.
793*cda5da8dSAndroid Build Coastguard Worker    current_loop = _get_running_loop()
794*cda5da8dSAndroid Build Coastguard Worker    if current_loop is not None:
795*cda5da8dSAndroid Build Coastguard Worker        return current_loop
796*cda5da8dSAndroid Build Coastguard Worker    return get_event_loop_policy().get_event_loop()
797*cda5da8dSAndroid Build Coastguard Worker
798*cda5da8dSAndroid Build Coastguard Worker
799*cda5da8dSAndroid Build Coastguard Workerdef set_event_loop(loop):
800*cda5da8dSAndroid Build Coastguard Worker    """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
801*cda5da8dSAndroid Build Coastguard Worker    get_event_loop_policy().set_event_loop(loop)
802*cda5da8dSAndroid Build Coastguard Worker
803*cda5da8dSAndroid Build Coastguard Worker
804*cda5da8dSAndroid Build Coastguard Workerdef new_event_loop():
805*cda5da8dSAndroid Build Coastguard Worker    """Equivalent to calling get_event_loop_policy().new_event_loop()."""
806*cda5da8dSAndroid Build Coastguard Worker    return get_event_loop_policy().new_event_loop()
807*cda5da8dSAndroid Build Coastguard Worker
808*cda5da8dSAndroid Build Coastguard Worker
809*cda5da8dSAndroid Build Coastguard Workerdef get_child_watcher():
810*cda5da8dSAndroid Build Coastguard Worker    """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
811*cda5da8dSAndroid Build Coastguard Worker    return get_event_loop_policy().get_child_watcher()
812*cda5da8dSAndroid Build Coastguard Worker
813*cda5da8dSAndroid Build Coastguard Worker
814*cda5da8dSAndroid Build Coastguard Workerdef set_child_watcher(watcher):
815*cda5da8dSAndroid Build Coastguard Worker    """Equivalent to calling
816*cda5da8dSAndroid Build Coastguard Worker    get_event_loop_policy().set_child_watcher(watcher)."""
817*cda5da8dSAndroid Build Coastguard Worker    return get_event_loop_policy().set_child_watcher(watcher)
818*cda5da8dSAndroid Build Coastguard Worker
819*cda5da8dSAndroid Build Coastguard Worker
820*cda5da8dSAndroid Build Coastguard Worker# Alias pure-Python implementations for testing purposes.
821*cda5da8dSAndroid Build Coastguard Worker_py__get_running_loop = _get_running_loop
822*cda5da8dSAndroid Build Coastguard Worker_py__set_running_loop = _set_running_loop
823*cda5da8dSAndroid Build Coastguard Worker_py_get_running_loop = get_running_loop
824*cda5da8dSAndroid Build Coastguard Worker_py_get_event_loop = get_event_loop
825*cda5da8dSAndroid Build Coastguard Worker_py__get_event_loop = _get_event_loop
826*cda5da8dSAndroid Build Coastguard Worker
827*cda5da8dSAndroid Build Coastguard Worker
828*cda5da8dSAndroid Build Coastguard Workertry:
829*cda5da8dSAndroid Build Coastguard Worker    # get_event_loop() is one of the most frequently called
830*cda5da8dSAndroid Build Coastguard Worker    # functions in asyncio.  Pure Python implementation is
831*cda5da8dSAndroid Build Coastguard Worker    # about 4 times slower than C-accelerated.
832*cda5da8dSAndroid Build Coastguard Worker    from _asyncio import (_get_running_loop, _set_running_loop,
833*cda5da8dSAndroid Build Coastguard Worker                          get_running_loop, get_event_loop, _get_event_loop)
834*cda5da8dSAndroid Build Coastguard Workerexcept ImportError:
835*cda5da8dSAndroid Build Coastguard Worker    pass
836*cda5da8dSAndroid Build Coastguard Workerelse:
837*cda5da8dSAndroid Build Coastguard Worker    # Alias C implementations for testing purposes.
838*cda5da8dSAndroid Build Coastguard Worker    _c__get_running_loop = _get_running_loop
839*cda5da8dSAndroid Build Coastguard Worker    _c__set_running_loop = _set_running_loop
840*cda5da8dSAndroid Build Coastguard Worker    _c_get_running_loop = get_running_loop
841*cda5da8dSAndroid Build Coastguard Worker    _c_get_event_loop = get_event_loop
842*cda5da8dSAndroid Build Coastguard Worker    _c__get_event_loop = _get_event_loop
843