17db96d56Sopenharmony_ci"""Event loop and event loop policy."""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci__all__ = (
47db96d56Sopenharmony_ci    'AbstractEventLoopPolicy',
57db96d56Sopenharmony_ci    'AbstractEventLoop', 'AbstractServer',
67db96d56Sopenharmony_ci    'Handle', 'TimerHandle',
77db96d56Sopenharmony_ci    'get_event_loop_policy', 'set_event_loop_policy',
87db96d56Sopenharmony_ci    'get_event_loop', 'set_event_loop', 'new_event_loop',
97db96d56Sopenharmony_ci    'get_child_watcher', 'set_child_watcher',
107db96d56Sopenharmony_ci    '_set_running_loop', 'get_running_loop',
117db96d56Sopenharmony_ci    '_get_running_loop',
127db96d56Sopenharmony_ci)
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciimport contextvars
157db96d56Sopenharmony_ciimport os
167db96d56Sopenharmony_ciimport socket
177db96d56Sopenharmony_ciimport subprocess
187db96d56Sopenharmony_ciimport sys
197db96d56Sopenharmony_ciimport threading
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_cifrom . import format_helpers
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciclass Handle:
257db96d56Sopenharmony_ci    """Object returned by callback registration methods."""
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci    __slots__ = ('_callback', '_args', '_cancelled', '_loop',
287db96d56Sopenharmony_ci                 '_source_traceback', '_repr', '__weakref__',
297db96d56Sopenharmony_ci                 '_context')
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci    def __init__(self, callback, args, loop, context=None):
327db96d56Sopenharmony_ci        if context is None:
337db96d56Sopenharmony_ci            context = contextvars.copy_context()
347db96d56Sopenharmony_ci        self._context = context
357db96d56Sopenharmony_ci        self._loop = loop
367db96d56Sopenharmony_ci        self._callback = callback
377db96d56Sopenharmony_ci        self._args = args
387db96d56Sopenharmony_ci        self._cancelled = False
397db96d56Sopenharmony_ci        self._repr = None
407db96d56Sopenharmony_ci        if self._loop.get_debug():
417db96d56Sopenharmony_ci            self._source_traceback = format_helpers.extract_stack(
427db96d56Sopenharmony_ci                sys._getframe(1))
437db96d56Sopenharmony_ci        else:
447db96d56Sopenharmony_ci            self._source_traceback = None
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    def _repr_info(self):
477db96d56Sopenharmony_ci        info = [self.__class__.__name__]
487db96d56Sopenharmony_ci        if self._cancelled:
497db96d56Sopenharmony_ci            info.append('cancelled')
507db96d56Sopenharmony_ci        if self._callback is not None:
517db96d56Sopenharmony_ci            info.append(format_helpers._format_callback_source(
527db96d56Sopenharmony_ci                self._callback, self._args))
537db96d56Sopenharmony_ci        if self._source_traceback:
547db96d56Sopenharmony_ci            frame = self._source_traceback[-1]
557db96d56Sopenharmony_ci            info.append(f'created at {frame[0]}:{frame[1]}')
567db96d56Sopenharmony_ci        return info
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def __repr__(self):
597db96d56Sopenharmony_ci        if self._repr is not None:
607db96d56Sopenharmony_ci            return self._repr
617db96d56Sopenharmony_ci        info = self._repr_info()
627db96d56Sopenharmony_ci        return '<{}>'.format(' '.join(info))
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    def cancel(self):
657db96d56Sopenharmony_ci        if not self._cancelled:
667db96d56Sopenharmony_ci            self._cancelled = True
677db96d56Sopenharmony_ci            if self._loop.get_debug():
687db96d56Sopenharmony_ci                # Keep a representation in debug mode to keep callback and
697db96d56Sopenharmony_ci                # parameters. For example, to log the warning
707db96d56Sopenharmony_ci                # "Executing <Handle...> took 2.5 second"
717db96d56Sopenharmony_ci                self._repr = repr(self)
727db96d56Sopenharmony_ci            self._callback = None
737db96d56Sopenharmony_ci            self._args = None
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    def cancelled(self):
767db96d56Sopenharmony_ci        return self._cancelled
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    def _run(self):
797db96d56Sopenharmony_ci        try:
807db96d56Sopenharmony_ci            self._context.run(self._callback, *self._args)
817db96d56Sopenharmony_ci        except (SystemExit, KeyboardInterrupt):
827db96d56Sopenharmony_ci            raise
837db96d56Sopenharmony_ci        except BaseException as exc:
847db96d56Sopenharmony_ci            cb = format_helpers._format_callback_source(
857db96d56Sopenharmony_ci                self._callback, self._args)
867db96d56Sopenharmony_ci            msg = f'Exception in callback {cb}'
877db96d56Sopenharmony_ci            context = {
887db96d56Sopenharmony_ci                'message': msg,
897db96d56Sopenharmony_ci                'exception': exc,
907db96d56Sopenharmony_ci                'handle': self,
917db96d56Sopenharmony_ci            }
927db96d56Sopenharmony_ci            if self._source_traceback:
937db96d56Sopenharmony_ci                context['source_traceback'] = self._source_traceback
947db96d56Sopenharmony_ci            self._loop.call_exception_handler(context)
957db96d56Sopenharmony_ci        self = None  # Needed to break cycles when an exception occurs.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ciclass TimerHandle(Handle):
997db96d56Sopenharmony_ci    """Object returned by timed callback registration methods."""
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci    __slots__ = ['_scheduled', '_when']
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci    def __init__(self, when, callback, args, loop, context=None):
1047db96d56Sopenharmony_ci        super().__init__(callback, args, loop, context)
1057db96d56Sopenharmony_ci        if self._source_traceback:
1067db96d56Sopenharmony_ci            del self._source_traceback[-1]
1077db96d56Sopenharmony_ci        self._when = when
1087db96d56Sopenharmony_ci        self._scheduled = False
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci    def _repr_info(self):
1117db96d56Sopenharmony_ci        info = super()._repr_info()
1127db96d56Sopenharmony_ci        pos = 2 if self._cancelled else 1
1137db96d56Sopenharmony_ci        info.insert(pos, f'when={self._when}')
1147db96d56Sopenharmony_ci        return info
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci    def __hash__(self):
1177db96d56Sopenharmony_ci        return hash(self._when)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def __lt__(self, other):
1207db96d56Sopenharmony_ci        if isinstance(other, TimerHandle):
1217db96d56Sopenharmony_ci            return self._when < other._when
1227db96d56Sopenharmony_ci        return NotImplemented
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci    def __le__(self, other):
1257db96d56Sopenharmony_ci        if isinstance(other, TimerHandle):
1267db96d56Sopenharmony_ci            return self._when < other._when or self.__eq__(other)
1277db96d56Sopenharmony_ci        return NotImplemented
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci    def __gt__(self, other):
1307db96d56Sopenharmony_ci        if isinstance(other, TimerHandle):
1317db96d56Sopenharmony_ci            return self._when > other._when
1327db96d56Sopenharmony_ci        return NotImplemented
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci    def __ge__(self, other):
1357db96d56Sopenharmony_ci        if isinstance(other, TimerHandle):
1367db96d56Sopenharmony_ci            return self._when > other._when or self.__eq__(other)
1377db96d56Sopenharmony_ci        return NotImplemented
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci    def __eq__(self, other):
1407db96d56Sopenharmony_ci        if isinstance(other, TimerHandle):
1417db96d56Sopenharmony_ci            return (self._when == other._when and
1427db96d56Sopenharmony_ci                    self._callback == other._callback and
1437db96d56Sopenharmony_ci                    self._args == other._args and
1447db96d56Sopenharmony_ci                    self._cancelled == other._cancelled)
1457db96d56Sopenharmony_ci        return NotImplemented
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci    def cancel(self):
1487db96d56Sopenharmony_ci        if not self._cancelled:
1497db96d56Sopenharmony_ci            self._loop._timer_handle_cancelled(self)
1507db96d56Sopenharmony_ci        super().cancel()
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci    def when(self):
1537db96d56Sopenharmony_ci        """Return a scheduled callback time.
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci        The time is an absolute timestamp, using the same time
1567db96d56Sopenharmony_ci        reference as loop.time().
1577db96d56Sopenharmony_ci        """
1587db96d56Sopenharmony_ci        return self._when
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ciclass AbstractServer:
1627db96d56Sopenharmony_ci    """Abstract server returned by create_server()."""
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    def close(self):
1657db96d56Sopenharmony_ci        """Stop serving.  This leaves existing connections open."""
1667db96d56Sopenharmony_ci        raise NotImplementedError
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci    def get_loop(self):
1697db96d56Sopenharmony_ci        """Get the event loop the Server object is attached to."""
1707db96d56Sopenharmony_ci        raise NotImplementedError
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci    def is_serving(self):
1737db96d56Sopenharmony_ci        """Return True if the server is accepting connections."""
1747db96d56Sopenharmony_ci        raise NotImplementedError
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    async def start_serving(self):
1777db96d56Sopenharmony_ci        """Start accepting connections.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci        This method is idempotent, so it can be called when
1807db96d56Sopenharmony_ci        the server is already being serving.
1817db96d56Sopenharmony_ci        """
1827db96d56Sopenharmony_ci        raise NotImplementedError
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    async def serve_forever(self):
1857db96d56Sopenharmony_ci        """Start accepting connections until the coroutine is cancelled.
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci        The server is closed when the coroutine is cancelled.
1887db96d56Sopenharmony_ci        """
1897db96d56Sopenharmony_ci        raise NotImplementedError
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci    async def wait_closed(self):
1927db96d56Sopenharmony_ci        """Coroutine to wait until service is closed."""
1937db96d56Sopenharmony_ci        raise NotImplementedError
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci    async def __aenter__(self):
1967db96d56Sopenharmony_ci        return self
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci    async def __aexit__(self, *exc):
1997db96d56Sopenharmony_ci        self.close()
2007db96d56Sopenharmony_ci        await self.wait_closed()
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ciclass AbstractEventLoop:
2047db96d56Sopenharmony_ci    """Abstract event loop."""
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    # Running and stopping the event loop.
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci    def run_forever(self):
2097db96d56Sopenharmony_ci        """Run the event loop until stop() is called."""
2107db96d56Sopenharmony_ci        raise NotImplementedError
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    def run_until_complete(self, future):
2137db96d56Sopenharmony_ci        """Run the event loop until a Future is done.
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci        Return the Future's result, or raise its exception.
2167db96d56Sopenharmony_ci        """
2177db96d56Sopenharmony_ci        raise NotImplementedError
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci    def stop(self):
2207db96d56Sopenharmony_ci        """Stop the event loop as soon as reasonable.
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci        Exactly how soon that is may depend on the implementation, but
2237db96d56Sopenharmony_ci        no more I/O callbacks should be scheduled.
2247db96d56Sopenharmony_ci        """
2257db96d56Sopenharmony_ci        raise NotImplementedError
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci    def is_running(self):
2287db96d56Sopenharmony_ci        """Return whether the event loop is currently running."""
2297db96d56Sopenharmony_ci        raise NotImplementedError
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    def is_closed(self):
2327db96d56Sopenharmony_ci        """Returns True if the event loop was closed."""
2337db96d56Sopenharmony_ci        raise NotImplementedError
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    def close(self):
2367db96d56Sopenharmony_ci        """Close the loop.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci        The loop should not be running.
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        This is idempotent and irreversible.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci        No other methods should be called after this one.
2437db96d56Sopenharmony_ci        """
2447db96d56Sopenharmony_ci        raise NotImplementedError
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci    async def shutdown_asyncgens(self):
2477db96d56Sopenharmony_ci        """Shutdown all active asynchronous generators."""
2487db96d56Sopenharmony_ci        raise NotImplementedError
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci    async def shutdown_default_executor(self):
2517db96d56Sopenharmony_ci        """Schedule the shutdown of the default executor."""
2527db96d56Sopenharmony_ci        raise NotImplementedError
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci    # Methods scheduling callbacks.  All these return Handles.
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    def _timer_handle_cancelled(self, handle):
2577db96d56Sopenharmony_ci        """Notification that a TimerHandle has been cancelled."""
2587db96d56Sopenharmony_ci        raise NotImplementedError
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def call_soon(self, callback, *args, context=None):
2617db96d56Sopenharmony_ci        return self.call_later(0, callback, *args, context=context)
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci    def call_later(self, delay, callback, *args, context=None):
2647db96d56Sopenharmony_ci        raise NotImplementedError
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci    def call_at(self, when, callback, *args, context=None):
2677db96d56Sopenharmony_ci        raise NotImplementedError
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    def time(self):
2707db96d56Sopenharmony_ci        raise NotImplementedError
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci    def create_future(self):
2737db96d56Sopenharmony_ci        raise NotImplementedError
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci    # Method scheduling a coroutine object: create a task.
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci    def create_task(self, coro, *, name=None, context=None):
2787db96d56Sopenharmony_ci        raise NotImplementedError
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci    # Methods for interacting with threads.
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci    def call_soon_threadsafe(self, callback, *args, context=None):
2837db96d56Sopenharmony_ci        raise NotImplementedError
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci    def run_in_executor(self, executor, func, *args):
2867db96d56Sopenharmony_ci        raise NotImplementedError
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci    def set_default_executor(self, executor):
2897db96d56Sopenharmony_ci        raise NotImplementedError
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci    # Network I/O methods returning Futures.
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci    async def getaddrinfo(self, host, port, *,
2947db96d56Sopenharmony_ci                          family=0, type=0, proto=0, flags=0):
2957db96d56Sopenharmony_ci        raise NotImplementedError
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ci    async def getnameinfo(self, sockaddr, flags=0):
2987db96d56Sopenharmony_ci        raise NotImplementedError
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci    async def create_connection(
3017db96d56Sopenharmony_ci            self, protocol_factory, host=None, port=None,
3027db96d56Sopenharmony_ci            *, ssl=None, family=0, proto=0,
3037db96d56Sopenharmony_ci            flags=0, sock=None, local_addr=None,
3047db96d56Sopenharmony_ci            server_hostname=None,
3057db96d56Sopenharmony_ci            ssl_handshake_timeout=None,
3067db96d56Sopenharmony_ci            ssl_shutdown_timeout=None,
3077db96d56Sopenharmony_ci            happy_eyeballs_delay=None, interleave=None):
3087db96d56Sopenharmony_ci        raise NotImplementedError
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci    async def create_server(
3117db96d56Sopenharmony_ci            self, protocol_factory, host=None, port=None,
3127db96d56Sopenharmony_ci            *, family=socket.AF_UNSPEC,
3137db96d56Sopenharmony_ci            flags=socket.AI_PASSIVE, sock=None, backlog=100,
3147db96d56Sopenharmony_ci            ssl=None, reuse_address=None, reuse_port=None,
3157db96d56Sopenharmony_ci            ssl_handshake_timeout=None,
3167db96d56Sopenharmony_ci            ssl_shutdown_timeout=None,
3177db96d56Sopenharmony_ci            start_serving=True):
3187db96d56Sopenharmony_ci        """A coroutine which creates a TCP server bound to host and port.
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci        The return value is a Server object which can be used to stop
3217db96d56Sopenharmony_ci        the service.
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci        If host is an empty string or None all interfaces are assumed
3247db96d56Sopenharmony_ci        and a list of multiple sockets will be returned (most likely
3257db96d56Sopenharmony_ci        one for IPv4 and another one for IPv6). The host parameter can also be
3267db96d56Sopenharmony_ci        a sequence (e.g. list) of hosts to bind to.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci        family can be set to either AF_INET or AF_INET6 to force the
3297db96d56Sopenharmony_ci        socket to use IPv4 or IPv6. If not set it will be determined
3307db96d56Sopenharmony_ci        from host (defaults to AF_UNSPEC).
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci        flags is a bitmask for getaddrinfo().
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci        sock can optionally be specified in order to use a preexisting
3357db96d56Sopenharmony_ci        socket object.
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci        backlog is the maximum number of queued connections passed to
3387db96d56Sopenharmony_ci        listen() (defaults to 100).
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci        ssl can be set to an SSLContext to enable SSL over the
3417db96d56Sopenharmony_ci        accepted connections.
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci        reuse_address tells the kernel to reuse a local socket in
3447db96d56Sopenharmony_ci        TIME_WAIT state, without waiting for its natural timeout to
3457db96d56Sopenharmony_ci        expire. If not specified will automatically be set to True on
3467db96d56Sopenharmony_ci        UNIX.
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci        reuse_port tells the kernel to allow this endpoint to be bound to
3497db96d56Sopenharmony_ci        the same port as other existing endpoints are bound to, so long as
3507db96d56Sopenharmony_ci        they all set this flag when being created. This option is not
3517db96d56Sopenharmony_ci        supported on Windows.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci        ssl_handshake_timeout is the time in seconds that an SSL server
3547db96d56Sopenharmony_ci        will wait for completion of the SSL handshake before aborting the
3557db96d56Sopenharmony_ci        connection. Default is 60s.
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci        ssl_shutdown_timeout is the time in seconds that an SSL server
3587db96d56Sopenharmony_ci        will wait for completion of the SSL shutdown procedure
3597db96d56Sopenharmony_ci        before aborting the connection. Default is 30s.
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci        start_serving set to True (default) causes the created server
3627db96d56Sopenharmony_ci        to start accepting connections immediately.  When set to False,
3637db96d56Sopenharmony_ci        the user should await Server.start_serving() or Server.serve_forever()
3647db96d56Sopenharmony_ci        to make the server to start accepting connections.
3657db96d56Sopenharmony_ci        """
3667db96d56Sopenharmony_ci        raise NotImplementedError
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci    async def sendfile(self, transport, file, offset=0, count=None,
3697db96d56Sopenharmony_ci                       *, fallback=True):
3707db96d56Sopenharmony_ci        """Send a file through a transport.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci        Return an amount of sent bytes.
3737db96d56Sopenharmony_ci        """
3747db96d56Sopenharmony_ci        raise NotImplementedError
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    async def start_tls(self, transport, protocol, sslcontext, *,
3777db96d56Sopenharmony_ci                        server_side=False,
3787db96d56Sopenharmony_ci                        server_hostname=None,
3797db96d56Sopenharmony_ci                        ssl_handshake_timeout=None,
3807db96d56Sopenharmony_ci                        ssl_shutdown_timeout=None):
3817db96d56Sopenharmony_ci        """Upgrade a transport to TLS.
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        Return a new transport that *protocol* should start using
3847db96d56Sopenharmony_ci        immediately.
3857db96d56Sopenharmony_ci        """
3867db96d56Sopenharmony_ci        raise NotImplementedError
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci    async def create_unix_connection(
3897db96d56Sopenharmony_ci            self, protocol_factory, path=None, *,
3907db96d56Sopenharmony_ci            ssl=None, sock=None,
3917db96d56Sopenharmony_ci            server_hostname=None,
3927db96d56Sopenharmony_ci            ssl_handshake_timeout=None,
3937db96d56Sopenharmony_ci            ssl_shutdown_timeout=None):
3947db96d56Sopenharmony_ci        raise NotImplementedError
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci    async def create_unix_server(
3977db96d56Sopenharmony_ci            self, protocol_factory, path=None, *,
3987db96d56Sopenharmony_ci            sock=None, backlog=100, ssl=None,
3997db96d56Sopenharmony_ci            ssl_handshake_timeout=None,
4007db96d56Sopenharmony_ci            ssl_shutdown_timeout=None,
4017db96d56Sopenharmony_ci            start_serving=True):
4027db96d56Sopenharmony_ci        """A coroutine which creates a UNIX Domain Socket server.
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci        The return value is a Server object, which can be used to stop
4057db96d56Sopenharmony_ci        the service.
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci        path is a str, representing a file system path to bind the
4087db96d56Sopenharmony_ci        server socket to.
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci        sock can optionally be specified in order to use a preexisting
4117db96d56Sopenharmony_ci        socket object.
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci        backlog is the maximum number of queued connections passed to
4147db96d56Sopenharmony_ci        listen() (defaults to 100).
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci        ssl can be set to an SSLContext to enable SSL over the
4177db96d56Sopenharmony_ci        accepted connections.
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci        ssl_handshake_timeout is the time in seconds that an SSL server
4207db96d56Sopenharmony_ci        will wait for the SSL handshake to complete (defaults to 60s).
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci        ssl_shutdown_timeout is the time in seconds that an SSL server
4237db96d56Sopenharmony_ci        will wait for the SSL shutdown to finish (defaults to 30s).
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci        start_serving set to True (default) causes the created server
4267db96d56Sopenharmony_ci        to start accepting connections immediately.  When set to False,
4277db96d56Sopenharmony_ci        the user should await Server.start_serving() or Server.serve_forever()
4287db96d56Sopenharmony_ci        to make the server to start accepting connections.
4297db96d56Sopenharmony_ci        """
4307db96d56Sopenharmony_ci        raise NotImplementedError
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci    async def connect_accepted_socket(
4337db96d56Sopenharmony_ci            self, protocol_factory, sock,
4347db96d56Sopenharmony_ci            *, ssl=None,
4357db96d56Sopenharmony_ci            ssl_handshake_timeout=None,
4367db96d56Sopenharmony_ci            ssl_shutdown_timeout=None):
4377db96d56Sopenharmony_ci        """Handle an accepted connection.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci        This is used by servers that accept connections outside of
4407db96d56Sopenharmony_ci        asyncio, but use asyncio to handle connections.
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci        This method is a coroutine.  When completed, the coroutine
4437db96d56Sopenharmony_ci        returns a (transport, protocol) pair.
4447db96d56Sopenharmony_ci        """
4457db96d56Sopenharmony_ci        raise NotImplementedError
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci    async def create_datagram_endpoint(self, protocol_factory,
4487db96d56Sopenharmony_ci                                       local_addr=None, remote_addr=None, *,
4497db96d56Sopenharmony_ci                                       family=0, proto=0, flags=0,
4507db96d56Sopenharmony_ci                                       reuse_address=None, reuse_port=None,
4517db96d56Sopenharmony_ci                                       allow_broadcast=None, sock=None):
4527db96d56Sopenharmony_ci        """A coroutine which creates a datagram endpoint.
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci        This method will try to establish the endpoint in the background.
4557db96d56Sopenharmony_ci        When successful, the coroutine returns a (transport, protocol) pair.
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci        protocol_factory must be a callable returning a protocol instance.
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci        socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on
4607db96d56Sopenharmony_ci        host (or family if specified), socket type SOCK_DGRAM.
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci        reuse_address tells the kernel to reuse a local socket in
4637db96d56Sopenharmony_ci        TIME_WAIT state, without waiting for its natural timeout to
4647db96d56Sopenharmony_ci        expire. If not specified it will automatically be set to True on
4657db96d56Sopenharmony_ci        UNIX.
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci        reuse_port tells the kernel to allow this endpoint to be bound to
4687db96d56Sopenharmony_ci        the same port as other existing endpoints are bound to, so long as
4697db96d56Sopenharmony_ci        they all set this flag when being created. This option is not
4707db96d56Sopenharmony_ci        supported on Windows and some UNIX's. If the
4717db96d56Sopenharmony_ci        :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
4727db96d56Sopenharmony_ci        capability is unsupported.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci        allow_broadcast tells the kernel to allow this endpoint to send
4757db96d56Sopenharmony_ci        messages to the broadcast address.
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci        sock can optionally be specified in order to use a preexisting
4787db96d56Sopenharmony_ci        socket object.
4797db96d56Sopenharmony_ci        """
4807db96d56Sopenharmony_ci        raise NotImplementedError
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci    # Pipes and subprocesses.
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci    async def connect_read_pipe(self, protocol_factory, pipe):
4857db96d56Sopenharmony_ci        """Register read pipe in event loop. Set the pipe to non-blocking mode.
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ci        protocol_factory should instantiate object with Protocol interface.
4887db96d56Sopenharmony_ci        pipe is a file-like object.
4897db96d56Sopenharmony_ci        Return pair (transport, protocol), where transport supports the
4907db96d56Sopenharmony_ci        ReadTransport interface."""
4917db96d56Sopenharmony_ci        # The reason to accept file-like object instead of just file descriptor
4927db96d56Sopenharmony_ci        # is: we need to own pipe and close it at transport finishing
4937db96d56Sopenharmony_ci        # Can got complicated errors if pass f.fileno(),
4947db96d56Sopenharmony_ci        # close fd in pipe transport then close f and vice versa.
4957db96d56Sopenharmony_ci        raise NotImplementedError
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci    async def connect_write_pipe(self, protocol_factory, pipe):
4987db96d56Sopenharmony_ci        """Register write pipe in event loop.
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci        protocol_factory should instantiate object with BaseProtocol interface.
5017db96d56Sopenharmony_ci        Pipe is file-like object already switched to nonblocking.
5027db96d56Sopenharmony_ci        Return pair (transport, protocol), where transport support
5037db96d56Sopenharmony_ci        WriteTransport interface."""
5047db96d56Sopenharmony_ci        # The reason to accept file-like object instead of just file descriptor
5057db96d56Sopenharmony_ci        # is: we need to own pipe and close it at transport finishing
5067db96d56Sopenharmony_ci        # Can got complicated errors if pass f.fileno(),
5077db96d56Sopenharmony_ci        # close fd in pipe transport then close f and vice versa.
5087db96d56Sopenharmony_ci        raise NotImplementedError
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci    async def subprocess_shell(self, protocol_factory, cmd, *,
5117db96d56Sopenharmony_ci                               stdin=subprocess.PIPE,
5127db96d56Sopenharmony_ci                               stdout=subprocess.PIPE,
5137db96d56Sopenharmony_ci                               stderr=subprocess.PIPE,
5147db96d56Sopenharmony_ci                               **kwargs):
5157db96d56Sopenharmony_ci        raise NotImplementedError
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci    async def subprocess_exec(self, protocol_factory, *args,
5187db96d56Sopenharmony_ci                              stdin=subprocess.PIPE,
5197db96d56Sopenharmony_ci                              stdout=subprocess.PIPE,
5207db96d56Sopenharmony_ci                              stderr=subprocess.PIPE,
5217db96d56Sopenharmony_ci                              **kwargs):
5227db96d56Sopenharmony_ci        raise NotImplementedError
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci    # Ready-based callback registration methods.
5257db96d56Sopenharmony_ci    # The add_*() methods return None.
5267db96d56Sopenharmony_ci    # The remove_*() methods return True if something was removed,
5277db96d56Sopenharmony_ci    # False if there was nothing to delete.
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci    def add_reader(self, fd, callback, *args):
5307db96d56Sopenharmony_ci        raise NotImplementedError
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci    def remove_reader(self, fd):
5337db96d56Sopenharmony_ci        raise NotImplementedError
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_ci    def add_writer(self, fd, callback, *args):
5367db96d56Sopenharmony_ci        raise NotImplementedError
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci    def remove_writer(self, fd):
5397db96d56Sopenharmony_ci        raise NotImplementedError
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci    # Completion based I/O methods returning Futures.
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ci    async def sock_recv(self, sock, nbytes):
5447db96d56Sopenharmony_ci        raise NotImplementedError
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci    async def sock_recv_into(self, sock, buf):
5477db96d56Sopenharmony_ci        raise NotImplementedError
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci    async def sock_recvfrom(self, sock, bufsize):
5507db96d56Sopenharmony_ci        raise NotImplementedError
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci    async def sock_recvfrom_into(self, sock, buf, nbytes=0):
5537db96d56Sopenharmony_ci        raise NotImplementedError
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci    async def sock_sendall(self, sock, data):
5567db96d56Sopenharmony_ci        raise NotImplementedError
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci    async def sock_sendto(self, sock, data, address):
5597db96d56Sopenharmony_ci        raise NotImplementedError
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci    async def sock_connect(self, sock, address):
5627db96d56Sopenharmony_ci        raise NotImplementedError
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci    async def sock_accept(self, sock):
5657db96d56Sopenharmony_ci        raise NotImplementedError
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci    async def sock_sendfile(self, sock, file, offset=0, count=None,
5687db96d56Sopenharmony_ci                            *, fallback=None):
5697db96d56Sopenharmony_ci        raise NotImplementedError
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci    # Signal handling.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci    def add_signal_handler(self, sig, callback, *args):
5747db96d56Sopenharmony_ci        raise NotImplementedError
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci    def remove_signal_handler(self, sig):
5777db96d56Sopenharmony_ci        raise NotImplementedError
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci    # Task factory.
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci    def set_task_factory(self, factory):
5827db96d56Sopenharmony_ci        raise NotImplementedError
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci    def get_task_factory(self):
5857db96d56Sopenharmony_ci        raise NotImplementedError
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci    # Error handlers.
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci    def get_exception_handler(self):
5907db96d56Sopenharmony_ci        raise NotImplementedError
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci    def set_exception_handler(self, handler):
5937db96d56Sopenharmony_ci        raise NotImplementedError
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci    def default_exception_handler(self, context):
5967db96d56Sopenharmony_ci        raise NotImplementedError
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci    def call_exception_handler(self, context):
5997db96d56Sopenharmony_ci        raise NotImplementedError
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci    # Debug flag management.
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci    def get_debug(self):
6047db96d56Sopenharmony_ci        raise NotImplementedError
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci    def set_debug(self, enabled):
6077db96d56Sopenharmony_ci        raise NotImplementedError
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ciclass AbstractEventLoopPolicy:
6117db96d56Sopenharmony_ci    """Abstract policy for accessing the event loop."""
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci    def get_event_loop(self):
6147db96d56Sopenharmony_ci        """Get the event loop for the current context.
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci        Returns an event loop object implementing the BaseEventLoop interface,
6177db96d56Sopenharmony_ci        or raises an exception in case no event loop has been set for the
6187db96d56Sopenharmony_ci        current context and the current policy does not specify to create one.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci        It should never return None."""
6217db96d56Sopenharmony_ci        raise NotImplementedError
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci    def set_event_loop(self, loop):
6247db96d56Sopenharmony_ci        """Set the event loop for the current context to loop."""
6257db96d56Sopenharmony_ci        raise NotImplementedError
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci    def new_event_loop(self):
6287db96d56Sopenharmony_ci        """Create and return a new event loop object according to this
6297db96d56Sopenharmony_ci        policy's rules. If there's need to set this loop as the event loop for
6307db96d56Sopenharmony_ci        the current context, set_event_loop must be called explicitly."""
6317db96d56Sopenharmony_ci        raise NotImplementedError
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci    # Child processes handling (Unix only).
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    def get_child_watcher(self):
6367db96d56Sopenharmony_ci        "Get the watcher for child processes."
6377db96d56Sopenharmony_ci        raise NotImplementedError
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci    def set_child_watcher(self, watcher):
6407db96d56Sopenharmony_ci        """Set the watcher for child processes."""
6417db96d56Sopenharmony_ci        raise NotImplementedError
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ciclass BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
6457db96d56Sopenharmony_ci    """Default policy implementation for accessing the event loop.
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci    In this policy, each thread has its own event loop.  However, we
6487db96d56Sopenharmony_ci    only automatically create an event loop by default for the main
6497db96d56Sopenharmony_ci    thread; other threads by default have no event loop.
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci    Other policies may have different rules (e.g. a single global
6527db96d56Sopenharmony_ci    event loop, or automatically creating an event loop per thread, or
6537db96d56Sopenharmony_ci    using some other notion of context to which an event loop is
6547db96d56Sopenharmony_ci    associated).
6557db96d56Sopenharmony_ci    """
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci    _loop_factory = None
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci    class _Local(threading.local):
6607db96d56Sopenharmony_ci        _loop = None
6617db96d56Sopenharmony_ci        _set_called = False
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci    def __init__(self):
6647db96d56Sopenharmony_ci        self._local = self._Local()
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ci    def get_event_loop(self):
6677db96d56Sopenharmony_ci        """Get the event loop for the current context.
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci        Returns an instance of EventLoop or raises an exception.
6707db96d56Sopenharmony_ci        """
6717db96d56Sopenharmony_ci        if (self._local._loop is None and
6727db96d56Sopenharmony_ci                not self._local._set_called and
6737db96d56Sopenharmony_ci                threading.current_thread() is threading.main_thread()):
6747db96d56Sopenharmony_ci            self.set_event_loop(self.new_event_loop())
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci        if self._local._loop is None:
6777db96d56Sopenharmony_ci            raise RuntimeError('There is no current event loop in thread %r.'
6787db96d56Sopenharmony_ci                               % threading.current_thread().name)
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci        return self._local._loop
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci    def set_event_loop(self, loop):
6837db96d56Sopenharmony_ci        """Set the event loop."""
6847db96d56Sopenharmony_ci        self._local._set_called = True
6857db96d56Sopenharmony_ci        if loop is not None and not isinstance(loop, AbstractEventLoop):
6867db96d56Sopenharmony_ci            raise TypeError(f"loop must be an instance of AbstractEventLoop or None, not '{type(loop).__name__}'")
6877db96d56Sopenharmony_ci        self._local._loop = loop
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci    def new_event_loop(self):
6907db96d56Sopenharmony_ci        """Create a new event loop.
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci        You must call set_event_loop() to make this the current event
6937db96d56Sopenharmony_ci        loop.
6947db96d56Sopenharmony_ci        """
6957db96d56Sopenharmony_ci        return self._loop_factory()
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci# Event loop policy.  The policy itself is always global, even if the
6997db96d56Sopenharmony_ci# policy's rules say that there is an event loop per thread (or other
7007db96d56Sopenharmony_ci# notion of context).  The default policy is installed by the first
7017db96d56Sopenharmony_ci# call to get_event_loop_policy().
7027db96d56Sopenharmony_ci_event_loop_policy = None
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci# Lock for protecting the on-the-fly creation of the event loop policy.
7057db96d56Sopenharmony_ci_lock = threading.Lock()
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci
7087db96d56Sopenharmony_ci# A TLS for the running event loop, used by _get_running_loop.
7097db96d56Sopenharmony_ciclass _RunningLoop(threading.local):
7107db96d56Sopenharmony_ci    loop_pid = (None, None)
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci_running_loop = _RunningLoop()
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_cidef get_running_loop():
7177db96d56Sopenharmony_ci    """Return the running event loop.  Raise a RuntimeError if there is none.
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci    This function is thread-specific.
7207db96d56Sopenharmony_ci    """
7217db96d56Sopenharmony_ci    # NOTE: this function is implemented in C (see _asynciomodule.c)
7227db96d56Sopenharmony_ci    loop = _get_running_loop()
7237db96d56Sopenharmony_ci    if loop is None:
7247db96d56Sopenharmony_ci        raise RuntimeError('no running event loop')
7257db96d56Sopenharmony_ci    return loop
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_cidef _get_running_loop():
7297db96d56Sopenharmony_ci    """Return the running event loop or None.
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci    This is a low-level function intended to be used by event loops.
7327db96d56Sopenharmony_ci    This function is thread-specific.
7337db96d56Sopenharmony_ci    """
7347db96d56Sopenharmony_ci    # NOTE: this function is implemented in C (see _asynciomodule.c)
7357db96d56Sopenharmony_ci    running_loop, pid = _running_loop.loop_pid
7367db96d56Sopenharmony_ci    if running_loop is not None and pid == os.getpid():
7377db96d56Sopenharmony_ci        return running_loop
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_cidef _set_running_loop(loop):
7417db96d56Sopenharmony_ci    """Set the running event loop.
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ci    This is a low-level function intended to be used by event loops.
7447db96d56Sopenharmony_ci    This function is thread-specific.
7457db96d56Sopenharmony_ci    """
7467db96d56Sopenharmony_ci    # NOTE: this function is implemented in C (see _asynciomodule.c)
7477db96d56Sopenharmony_ci    _running_loop.loop_pid = (loop, os.getpid())
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_cidef _init_event_loop_policy():
7517db96d56Sopenharmony_ci    global _event_loop_policy
7527db96d56Sopenharmony_ci    with _lock:
7537db96d56Sopenharmony_ci        if _event_loop_policy is None:  # pragma: no branch
7547db96d56Sopenharmony_ci            from . import DefaultEventLoopPolicy
7557db96d56Sopenharmony_ci            _event_loop_policy = DefaultEventLoopPolicy()
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_cidef get_event_loop_policy():
7597db96d56Sopenharmony_ci    """Get the current event loop policy."""
7607db96d56Sopenharmony_ci    if _event_loop_policy is None:
7617db96d56Sopenharmony_ci        _init_event_loop_policy()
7627db96d56Sopenharmony_ci    return _event_loop_policy
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_cidef set_event_loop_policy(policy):
7667db96d56Sopenharmony_ci    """Set the current event loop policy.
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci    If policy is None, the default policy is restored."""
7697db96d56Sopenharmony_ci    global _event_loop_policy
7707db96d56Sopenharmony_ci    if policy is not None and not isinstance(policy, AbstractEventLoopPolicy):
7717db96d56Sopenharmony_ci        raise TypeError(f"policy must be an instance of AbstractEventLoopPolicy or None, not '{type(policy).__name__}'")
7727db96d56Sopenharmony_ci    _event_loop_policy = policy
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_cidef get_event_loop():
7767db96d56Sopenharmony_ci    """Return an asyncio event loop.
7777db96d56Sopenharmony_ci
7787db96d56Sopenharmony_ci    When called from a coroutine or a callback (e.g. scheduled with call_soon
7797db96d56Sopenharmony_ci    or similar API), this function will always return the running event loop.
7807db96d56Sopenharmony_ci
7817db96d56Sopenharmony_ci    If there is no running event loop set, the function will return
7827db96d56Sopenharmony_ci    the result of `get_event_loop_policy().get_event_loop()` call.
7837db96d56Sopenharmony_ci    """
7847db96d56Sopenharmony_ci    # NOTE: this function is implemented in C (see _asynciomodule.c)
7857db96d56Sopenharmony_ci    return _py__get_event_loop()
7867db96d56Sopenharmony_ci
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_cidef _get_event_loop(stacklevel=3):
7897db96d56Sopenharmony_ci    # This internal method is going away in Python 3.12, left here only for
7907db96d56Sopenharmony_ci    # backwards compatibility with 3.10.0 - 3.10.8 and 3.11.0.
7917db96d56Sopenharmony_ci    # Similarly, this method's C equivalent in _asyncio is going away as well.
7927db96d56Sopenharmony_ci    # See GH-99949 for more details.
7937db96d56Sopenharmony_ci    current_loop = _get_running_loop()
7947db96d56Sopenharmony_ci    if current_loop is not None:
7957db96d56Sopenharmony_ci        return current_loop
7967db96d56Sopenharmony_ci    return get_event_loop_policy().get_event_loop()
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_cidef set_event_loop(loop):
8007db96d56Sopenharmony_ci    """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
8017db96d56Sopenharmony_ci    get_event_loop_policy().set_event_loop(loop)
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_cidef new_event_loop():
8057db96d56Sopenharmony_ci    """Equivalent to calling get_event_loop_policy().new_event_loop()."""
8067db96d56Sopenharmony_ci    return get_event_loop_policy().new_event_loop()
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_cidef get_child_watcher():
8107db96d56Sopenharmony_ci    """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
8117db96d56Sopenharmony_ci    return get_event_loop_policy().get_child_watcher()
8127db96d56Sopenharmony_ci
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_cidef set_child_watcher(watcher):
8157db96d56Sopenharmony_ci    """Equivalent to calling
8167db96d56Sopenharmony_ci    get_event_loop_policy().set_child_watcher(watcher)."""
8177db96d56Sopenharmony_ci    return get_event_loop_policy().set_child_watcher(watcher)
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci# Alias pure-Python implementations for testing purposes.
8217db96d56Sopenharmony_ci_py__get_running_loop = _get_running_loop
8227db96d56Sopenharmony_ci_py__set_running_loop = _set_running_loop
8237db96d56Sopenharmony_ci_py_get_running_loop = get_running_loop
8247db96d56Sopenharmony_ci_py_get_event_loop = get_event_loop
8257db96d56Sopenharmony_ci_py__get_event_loop = _get_event_loop
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_citry:
8297db96d56Sopenharmony_ci    # get_event_loop() is one of the most frequently called
8307db96d56Sopenharmony_ci    # functions in asyncio.  Pure Python implementation is
8317db96d56Sopenharmony_ci    # about 4 times slower than C-accelerated.
8327db96d56Sopenharmony_ci    from _asyncio import (_get_running_loop, _set_running_loop,
8337db96d56Sopenharmony_ci                          get_running_loop, get_event_loop, _get_event_loop)
8347db96d56Sopenharmony_ciexcept ImportError:
8357db96d56Sopenharmony_ci    pass
8367db96d56Sopenharmony_cielse:
8377db96d56Sopenharmony_ci    # Alias C implementations for testing purposes.
8387db96d56Sopenharmony_ci    _c__get_running_loop = _get_running_loop
8397db96d56Sopenharmony_ci    _c__set_running_loop = _set_running_loop
8407db96d56Sopenharmony_ci    _c_get_running_loop = get_running_loop
8417db96d56Sopenharmony_ci    _c_get_event_loop = get_event_loop
8427db96d56Sopenharmony_ci    _c__get_event_loop = _get_event_loop
843