@rowstile/cli-win32-x64 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +23 -0
- package/python/DLLs/_asyncio.pyd +0 -0
- package/python/DLLs/_bz2.pyd +0 -0
- package/python/DLLs/_ctypes.pyd +0 -0
- package/python/DLLs/_ctypes_test.pyd +0 -0
- package/python/DLLs/_decimal.pyd +0 -0
- package/python/DLLs/_elementtree.pyd +0 -0
- package/python/DLLs/_hashlib.pyd +0 -0
- package/python/DLLs/_lzma.pyd +0 -0
- package/python/DLLs/_multiprocessing.pyd +0 -0
- package/python/DLLs/_overlapped.pyd +0 -0
- package/python/DLLs/_queue.pyd +0 -0
- package/python/DLLs/_socket.pyd +0 -0
- package/python/DLLs/_sqlite3.pyd +0 -0
- package/python/DLLs/_ssl.pyd +0 -0
- package/python/DLLs/_testbuffer.pyd +0 -0
- package/python/DLLs/_testcapi.pyd +0 -0
- package/python/DLLs/_testclinic.pyd +0 -0
- package/python/DLLs/_testclinic_limited.pyd +0 -0
- package/python/DLLs/_testconsole.pyd +0 -0
- package/python/DLLs/_testimportmultiple.pyd +0 -0
- package/python/DLLs/_testinternalcapi.pyd +0 -0
- package/python/DLLs/_testlimitedcapi.pyd +0 -0
- package/python/DLLs/_testmultiphase.pyd +0 -0
- package/python/DLLs/_testsinglephase.pyd +0 -0
- package/python/DLLs/_uuid.pyd +0 -0
- package/python/DLLs/_wmi.pyd +0 -0
- package/python/DLLs/_zoneinfo.pyd +0 -0
- package/python/DLLs/libcrypto-3-x64.dll +0 -0
- package/python/DLLs/libffi-8.dll +0 -0
- package/python/DLLs/libssl-3-x64.dll +0 -0
- package/python/DLLs/pyexpat.pyd +0 -0
- package/python/DLLs/select.pyd +0 -0
- package/python/DLLs/sqlite3.dll +0 -0
- package/python/DLLs/unicodedata.pyd +0 -0
- package/python/DLLs/winsound.pyd +0 -0
- package/python/DLLs/zlib1.dll +0 -0
- package/python/LICENSE.txt +445 -0
- package/python/Lib/__future__.py +147 -0
- package/python/Lib/__hello__.py +16 -0
- package/python/Lib/__pycache__/__future__.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_colorize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compat_pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compression.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_markupbase.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_opcode_metadata.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_weakrefset.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ast.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/base64.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bisect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bz2.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/calendar.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/colorsys.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/compileall.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/configparser.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/contextlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copy.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copyreg.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/csv.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dataclasses.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/datetime.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/decimal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dis.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/enum.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/filecmp.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fnmatch.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fractions.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/functools.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/getpass.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gettext.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gzip.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hashlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/heapq.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hmac.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/inspect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ipaddress.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/keyword.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/linecache.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/locale.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/lzma.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/mimetypes.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/nturl2path.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/numbers.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/opcode.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/operator.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/optparse.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pkgutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/platform.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/py_compile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/queue.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/quopri.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/random.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/reprlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/selectors.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shlex.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/signal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socket.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socketserver.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ssl.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/string.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/stringprep.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/struct.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/subprocess.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tarfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tempfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/textwrap.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/threading.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/token.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tokenize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/traceback.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/types.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/typing.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/uuid.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/warnings.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/weakref.cpython-313.pyc +0 -0
- package/python/Lib/_aix_support.py +108 -0
- package/python/Lib/_android_support.py +192 -0
- package/python/Lib/_apple_support.py +66 -0
- package/python/Lib/_collections_abc.py +1187 -0
- package/python/Lib/_colorize.py +119 -0
- package/python/Lib/_compat_pickle.py +251 -0
- package/python/Lib/_compression.py +162 -0
- package/python/Lib/_ios_support.py +71 -0
- package/python/Lib/_markupbase.py +396 -0
- package/python/Lib/_opcode_metadata.py +343 -0
- package/python/Lib/_osx_support.py +579 -0
- package/python/Lib/_py_abc.py +147 -0
- package/python/Lib/_pydatetime.py +2640 -0
- package/python/Lib/_pydecimal.py +6356 -0
- package/python/Lib/_pyio.py +2714 -0
- package/python/Lib/_pylong.py +363 -0
- package/python/Lib/_pyrepl/__init__.py +19 -0
- package/python/Lib/_pyrepl/__main__.py +10 -0
- package/python/Lib/_pyrepl/_minimal_curses.py +68 -0
- package/python/Lib/_pyrepl/_threading_handler.py +74 -0
- package/python/Lib/_pyrepl/base_eventqueue.py +110 -0
- package/python/Lib/_pyrepl/commands.py +492 -0
- package/python/Lib/_pyrepl/completing_reader.py +295 -0
- package/python/Lib/_pyrepl/console.py +229 -0
- package/python/Lib/_pyrepl/curses.py +33 -0
- package/python/Lib/_pyrepl/fancy_termios.py +82 -0
- package/python/Lib/_pyrepl/historical_reader.py +419 -0
- package/python/Lib/_pyrepl/input.py +114 -0
- package/python/Lib/_pyrepl/keymap.py +213 -0
- package/python/Lib/_pyrepl/main.py +59 -0
- package/python/Lib/_pyrepl/mypy.ini +29 -0
- package/python/Lib/_pyrepl/pager.py +175 -0
- package/python/Lib/_pyrepl/reader.py +764 -0
- package/python/Lib/_pyrepl/readline.py +599 -0
- package/python/Lib/_pyrepl/simple_interact.py +180 -0
- package/python/Lib/_pyrepl/trace.py +21 -0
- package/python/Lib/_pyrepl/types.py +10 -0
- package/python/Lib/_pyrepl/unix_console.py +852 -0
- package/python/Lib/_pyrepl/unix_eventqueue.py +76 -0
- package/python/Lib/_pyrepl/utils.py +83 -0
- package/python/Lib/_pyrepl/windows_console.py +687 -0
- package/python/Lib/_pyrepl/windows_eventqueue.py +42 -0
- package/python/Lib/_sitebuiltins.py +91 -0
- package/python/Lib/_strptime.py +800 -0
- package/python/Lib/_threading_local.py +120 -0
- package/python/Lib/_weakrefset.py +205 -0
- package/python/Lib/abc.py +188 -0
- package/python/Lib/antigravity.py +17 -0
- package/python/Lib/argparse.py +2690 -0
- package/python/Lib/ast.py +1865 -0
- package/python/Lib/asyncio/__init__.py +47 -0
- package/python/Lib/asyncio/__main__.py +211 -0
- package/python/Lib/asyncio/base_events.py +2086 -0
- package/python/Lib/asyncio/base_futures.py +67 -0
- package/python/Lib/asyncio/base_subprocess.py +312 -0
- package/python/Lib/asyncio/base_tasks.py +94 -0
- package/python/Lib/asyncio/constants.py +41 -0
- package/python/Lib/asyncio/coroutines.py +109 -0
- package/python/Lib/asyncio/events.py +885 -0
- package/python/Lib/asyncio/exceptions.py +62 -0
- package/python/Lib/asyncio/format_helpers.py +84 -0
- package/python/Lib/asyncio/futures.py +425 -0
- package/python/Lib/asyncio/locks.py +617 -0
- package/python/Lib/asyncio/log.py +7 -0
- package/python/Lib/asyncio/mixins.py +21 -0
- package/python/Lib/asyncio/proactor_events.py +891 -0
- package/python/Lib/asyncio/protocols.py +216 -0
- package/python/Lib/asyncio/queues.py +309 -0
- package/python/Lib/asyncio/runners.py +217 -0
- package/python/Lib/asyncio/selector_events.py +1328 -0
- package/python/Lib/asyncio/sslproto.py +929 -0
- package/python/Lib/asyncio/staggered.py +174 -0
- package/python/Lib/asyncio/streams.py +787 -0
- package/python/Lib/asyncio/subprocess.py +229 -0
- package/python/Lib/asyncio/taskgroups.py +278 -0
- package/python/Lib/asyncio/tasks.py +1121 -0
- package/python/Lib/asyncio/threads.py +26 -0
- package/python/Lib/asyncio/timeouts.py +185 -0
- package/python/Lib/asyncio/transports.py +337 -0
- package/python/Lib/asyncio/trsock.py +98 -0
- package/python/Lib/asyncio/unix_events.py +1550 -0
- package/python/Lib/asyncio/windows_events.py +906 -0
- package/python/Lib/asyncio/windows_utils.py +181 -0
- package/python/Lib/base64.py +628 -0
- package/python/Lib/bdb.py +973 -0
- package/python/Lib/bisect.py +118 -0
- package/python/Lib/bz2.py +352 -0
- package/python/Lib/cProfile.py +197 -0
- package/python/Lib/calendar.py +813 -0
- package/python/Lib/cmd.py +409 -0
- package/python/Lib/code.py +386 -0
- package/python/Lib/codecs.py +1132 -0
- package/python/Lib/codeop.py +155 -0
- package/python/Lib/collections/__init__.py +1603 -0
- package/python/Lib/collections/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/colorsys.py +166 -0
- package/python/Lib/compileall.py +470 -0
- package/python/Lib/concurrent/__init__.py +1 -0
- package/python/Lib/concurrent/futures/__init__.py +54 -0
- package/python/Lib/concurrent/futures/_base.py +660 -0
- package/python/Lib/concurrent/futures/process.py +892 -0
- package/python/Lib/concurrent/futures/thread.py +240 -0
- package/python/Lib/configparser.py +1396 -0
- package/python/Lib/contextlib.py +814 -0
- package/python/Lib/contextvars.py +4 -0
- package/python/Lib/copy.py +306 -0
- package/python/Lib/copyreg.py +217 -0
- package/python/Lib/csv.py +527 -0
- package/python/Lib/ctypes/__init__.py +602 -0
- package/python/Lib/ctypes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/_endian.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/wintypes.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/_aix.py +327 -0
- package/python/Lib/ctypes/_endian.py +78 -0
- package/python/Lib/ctypes/macholib/README.ctypes +7 -0
- package/python/Lib/ctypes/macholib/__init__.py +9 -0
- package/python/Lib/ctypes/macholib/dyld.py +165 -0
- package/python/Lib/ctypes/macholib/dylib.py +42 -0
- package/python/Lib/ctypes/macholib/fetch_macholib +2 -0
- package/python/Lib/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/Lib/ctypes/macholib/framework.py +42 -0
- package/python/Lib/ctypes/util.py +387 -0
- package/python/Lib/ctypes/wintypes.py +202 -0
- package/python/Lib/curses/__init__.py +101 -0
- package/python/Lib/curses/ascii.py +99 -0
- package/python/Lib/curses/has_key.py +192 -0
- package/python/Lib/curses/panel.py +6 -0
- package/python/Lib/curses/textpad.py +236 -0
- package/python/Lib/dataclasses.py +1679 -0
- package/python/Lib/datetime.py +9 -0
- package/python/Lib/dbm/__init__.py +194 -0
- package/python/Lib/dbm/dumb.py +319 -0
- package/python/Lib/dbm/gnu.py +3 -0
- package/python/Lib/dbm/ndbm.py +3 -0
- package/python/Lib/dbm/sqlite3.py +144 -0
- package/python/Lib/decimal.py +109 -0
- package/python/Lib/difflib.py +2058 -0
- package/python/Lib/dis.py +1075 -0
- package/python/Lib/doctest.py +2919 -0
- package/python/Lib/email/__init__.py +61 -0
- package/python/Lib/email/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_encoded_words.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_parseaddr.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_policybase.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/base64mime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/charset.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/encoders.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/errors.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/feedparser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/header.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/iterators.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/message.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/quoprimime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/utils.cpython-313.pyc +0 -0
- package/python/Lib/email/_encoded_words.py +233 -0
- package/python/Lib/email/_header_value_parser.py +3153 -0
- package/python/Lib/email/_parseaddr.py +563 -0
- package/python/Lib/email/_policybase.py +382 -0
- package/python/Lib/email/architecture.rst +216 -0
- package/python/Lib/email/base64mime.py +115 -0
- package/python/Lib/email/charset.py +396 -0
- package/python/Lib/email/contentmanager.py +254 -0
- package/python/Lib/email/encoders.py +65 -0
- package/python/Lib/email/errors.py +117 -0
- package/python/Lib/email/feedparser.py +536 -0
- package/python/Lib/email/generator.py +530 -0
- package/python/Lib/email/header.py +582 -0
- package/python/Lib/email/headerregistry.py +618 -0
- package/python/Lib/email/iterators.py +68 -0
- package/python/Lib/email/message.py +1217 -0
- package/python/Lib/email/mime/__init__.py +0 -0
- package/python/Lib/email/mime/application.py +37 -0
- package/python/Lib/email/mime/audio.py +97 -0
- package/python/Lib/email/mime/base.py +29 -0
- package/python/Lib/email/mime/image.py +152 -0
- package/python/Lib/email/mime/message.py +33 -0
- package/python/Lib/email/mime/multipart.py +47 -0
- package/python/Lib/email/mime/nonmultipart.py +21 -0
- package/python/Lib/email/mime/text.py +40 -0
- package/python/Lib/email/parser.py +127 -0
- package/python/Lib/email/policy.py +232 -0
- package/python/Lib/email/quoprimime.py +300 -0
- package/python/Lib/email/utils.py +497 -0
- package/python/Lib/encodings/__init__.py +179 -0
- package/python/Lib/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp1252.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp437.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/hex_codec.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/idna.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/Lib/encodings/aliases.py +560 -0
- package/python/Lib/encodings/ascii.py +50 -0
- package/python/Lib/encodings/base64_codec.py +55 -0
- package/python/Lib/encodings/big5.py +39 -0
- package/python/Lib/encodings/big5hkscs.py +39 -0
- package/python/Lib/encodings/bz2_codec.py +78 -0
- package/python/Lib/encodings/charmap.py +69 -0
- package/python/Lib/encodings/cp037.py +307 -0
- package/python/Lib/encodings/cp1006.py +307 -0
- package/python/Lib/encodings/cp1026.py +307 -0
- package/python/Lib/encodings/cp1125.py +698 -0
- package/python/Lib/encodings/cp1140.py +307 -0
- package/python/Lib/encodings/cp1250.py +307 -0
- package/python/Lib/encodings/cp1251.py +307 -0
- package/python/Lib/encodings/cp1252.py +307 -0
- package/python/Lib/encodings/cp1253.py +307 -0
- package/python/Lib/encodings/cp1254.py +307 -0
- package/python/Lib/encodings/cp1255.py +307 -0
- package/python/Lib/encodings/cp1256.py +307 -0
- package/python/Lib/encodings/cp1257.py +307 -0
- package/python/Lib/encodings/cp1258.py +307 -0
- package/python/Lib/encodings/cp273.py +307 -0
- package/python/Lib/encodings/cp424.py +307 -0
- package/python/Lib/encodings/cp437.py +698 -0
- package/python/Lib/encodings/cp500.py +307 -0
- package/python/Lib/encodings/cp720.py +309 -0
- package/python/Lib/encodings/cp737.py +698 -0
- package/python/Lib/encodings/cp775.py +697 -0
- package/python/Lib/encodings/cp850.py +698 -0
- package/python/Lib/encodings/cp852.py +698 -0
- package/python/Lib/encodings/cp855.py +698 -0
- package/python/Lib/encodings/cp856.py +307 -0
- package/python/Lib/encodings/cp857.py +694 -0
- package/python/Lib/encodings/cp858.py +698 -0
- package/python/Lib/encodings/cp860.py +698 -0
- package/python/Lib/encodings/cp861.py +698 -0
- package/python/Lib/encodings/cp862.py +698 -0
- package/python/Lib/encodings/cp863.py +698 -0
- package/python/Lib/encodings/cp864.py +690 -0
- package/python/Lib/encodings/cp865.py +698 -0
- package/python/Lib/encodings/cp866.py +698 -0
- package/python/Lib/encodings/cp869.py +689 -0
- package/python/Lib/encodings/cp874.py +307 -0
- package/python/Lib/encodings/cp875.py +307 -0
- package/python/Lib/encodings/cp932.py +39 -0
- package/python/Lib/encodings/cp949.py +39 -0
- package/python/Lib/encodings/cp950.py +39 -0
- package/python/Lib/encodings/euc_jis_2004.py +39 -0
- package/python/Lib/encodings/euc_jisx0213.py +39 -0
- package/python/Lib/encodings/euc_jp.py +39 -0
- package/python/Lib/encodings/euc_kr.py +39 -0
- package/python/Lib/encodings/gb18030.py +39 -0
- package/python/Lib/encodings/gb2312.py +39 -0
- package/python/Lib/encodings/gbk.py +39 -0
- package/python/Lib/encodings/hex_codec.py +55 -0
- package/python/Lib/encodings/hp_roman8.py +314 -0
- package/python/Lib/encodings/hz.py +39 -0
- package/python/Lib/encodings/idna.py +387 -0
- package/python/Lib/encodings/iso2022_jp.py +39 -0
- package/python/Lib/encodings/iso2022_jp_1.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2004.py +39 -0
- package/python/Lib/encodings/iso2022_jp_3.py +39 -0
- package/python/Lib/encodings/iso2022_jp_ext.py +39 -0
- package/python/Lib/encodings/iso2022_kr.py +39 -0
- package/python/Lib/encodings/iso8859_1.py +307 -0
- package/python/Lib/encodings/iso8859_10.py +307 -0
- package/python/Lib/encodings/iso8859_11.py +307 -0
- package/python/Lib/encodings/iso8859_13.py +307 -0
- package/python/Lib/encodings/iso8859_14.py +307 -0
- package/python/Lib/encodings/iso8859_15.py +307 -0
- package/python/Lib/encodings/iso8859_16.py +307 -0
- package/python/Lib/encodings/iso8859_2.py +307 -0
- package/python/Lib/encodings/iso8859_3.py +307 -0
- package/python/Lib/encodings/iso8859_4.py +307 -0
- package/python/Lib/encodings/iso8859_5.py +307 -0
- package/python/Lib/encodings/iso8859_6.py +307 -0
- package/python/Lib/encodings/iso8859_7.py +307 -0
- package/python/Lib/encodings/iso8859_8.py +307 -0
- package/python/Lib/encodings/iso8859_9.py +307 -0
- package/python/Lib/encodings/johab.py +39 -0
- package/python/Lib/encodings/koi8_r.py +307 -0
- package/python/Lib/encodings/koi8_t.py +308 -0
- package/python/Lib/encodings/koi8_u.py +307 -0
- package/python/Lib/encodings/kz1048.py +307 -0
- package/python/Lib/encodings/latin_1.py +50 -0
- package/python/Lib/encodings/mac_arabic.py +698 -0
- package/python/Lib/encodings/mac_croatian.py +307 -0
- package/python/Lib/encodings/mac_cyrillic.py +307 -0
- package/python/Lib/encodings/mac_farsi.py +307 -0
- package/python/Lib/encodings/mac_greek.py +307 -0
- package/python/Lib/encodings/mac_iceland.py +307 -0
- package/python/Lib/encodings/mac_latin2.py +312 -0
- package/python/Lib/encodings/mac_roman.py +307 -0
- package/python/Lib/encodings/mac_romanian.py +307 -0
- package/python/Lib/encodings/mac_turkish.py +307 -0
- package/python/Lib/encodings/mbcs.py +47 -0
- package/python/Lib/encodings/oem.py +41 -0
- package/python/Lib/encodings/palmos.py +308 -0
- package/python/Lib/encodings/ptcp154.py +312 -0
- package/python/Lib/encodings/punycode.py +253 -0
- package/python/Lib/encodings/quopri_codec.py +56 -0
- package/python/Lib/encodings/raw_unicode_escape.py +46 -0
- package/python/Lib/encodings/rot_13.py +113 -0
- package/python/Lib/encodings/shift_jis.py +39 -0
- package/python/Lib/encodings/shift_jis_2004.py +39 -0
- package/python/Lib/encodings/shift_jisx0213.py +39 -0
- package/python/Lib/encodings/tis_620.py +307 -0
- package/python/Lib/encodings/undefined.py +49 -0
- package/python/Lib/encodings/unicode_escape.py +46 -0
- package/python/Lib/encodings/utf_16.py +155 -0
- package/python/Lib/encodings/utf_16_be.py +42 -0
- package/python/Lib/encodings/utf_16_le.py +42 -0
- package/python/Lib/encodings/utf_32.py +150 -0
- package/python/Lib/encodings/utf_32_be.py +37 -0
- package/python/Lib/encodings/utf_32_le.py +37 -0
- package/python/Lib/encodings/utf_7.py +38 -0
- package/python/Lib/encodings/utf_8.py +42 -0
- package/python/Lib/encodings/utf_8_sig.py +130 -0
- package/python/Lib/encodings/uu_codec.py +103 -0
- package/python/Lib/encodings/zlib_codec.py +77 -0
- package/python/Lib/enum.py +2183 -0
- package/python/Lib/filecmp.py +320 -0
- package/python/Lib/fileinput.py +442 -0
- package/python/Lib/fnmatch.py +192 -0
- package/python/Lib/fractions.py +1043 -0
- package/python/Lib/ftplib.py +975 -0
- package/python/Lib/functools.py +1036 -0
- package/python/Lib/genericpath.py +200 -0
- package/python/Lib/getopt.py +215 -0
- package/python/Lib/getpass.py +192 -0
- package/python/Lib/gettext.py +657 -0
- package/python/Lib/glob.py +572 -0
- package/python/Lib/graphlib.py +250 -0
- package/python/Lib/gzip.py +693 -0
- package/python/Lib/hashlib.py +255 -0
- package/python/Lib/heapq.py +603 -0
- package/python/Lib/hmac.py +220 -0
- package/python/Lib/html/__init__.py +132 -0
- package/python/Lib/html/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/entities.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/html/entities.py +2513 -0
- package/python/Lib/html/parser.py +583 -0
- package/python/Lib/http/__init__.py +202 -0
- package/python/Lib/http/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookiejar.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookies.cpython-313.pyc +0 -0
- package/python/Lib/http/client.py +1598 -0
- package/python/Lib/http/cookiejar.py +2122 -0
- package/python/Lib/http/cookies.py +635 -0
- package/python/Lib/http/server.py +1355 -0
- package/python/Lib/imaplib.py +1769 -0
- package/python/Lib/importlib/__init__.py +136 -0
- package/python/Lib/importlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/_abc.py +39 -0
- package/python/Lib/importlib/_bootstrap.py +1559 -0
- package/python/Lib/importlib/_bootstrap_external.py +1826 -0
- package/python/Lib/importlib/abc.py +243 -0
- package/python/Lib/importlib/machinery.py +21 -0
- package/python/Lib/importlib/metadata/__init__.py +1093 -0
- package/python/Lib/importlib/metadata/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_collections.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_functools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_meta.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_text.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/_adapters.py +89 -0
- package/python/Lib/importlib/metadata/_collections.py +30 -0
- package/python/Lib/importlib/metadata/_functools.py +104 -0
- package/python/Lib/importlib/metadata/_itertools.py +73 -0
- package/python/Lib/importlib/metadata/_meta.py +67 -0
- package/python/Lib/importlib/metadata/_text.py +99 -0
- package/python/Lib/importlib/metadata/diagnose.py +21 -0
- package/python/Lib/importlib/readers.py +12 -0
- package/python/Lib/importlib/resources/__init__.py +43 -0
- package/python/Lib/importlib/resources/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_common.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_functional.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/_adapters.py +168 -0
- package/python/Lib/importlib/resources/_common.py +211 -0
- package/python/Lib/importlib/resources/_functional.py +81 -0
- package/python/Lib/importlib/resources/_itertools.py +38 -0
- package/python/Lib/importlib/resources/abc.py +173 -0
- package/python/Lib/importlib/resources/readers.py +203 -0
- package/python/Lib/importlib/resources/simple.py +106 -0
- package/python/Lib/importlib/simple.py +14 -0
- package/python/Lib/importlib/util.py +274 -0
- package/python/Lib/inspect.py +3479 -0
- package/python/Lib/io.py +99 -0
- package/python/Lib/ipaddress.py +2440 -0
- package/python/Lib/json/__init__.py +365 -0
- package/python/Lib/json/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/decoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/encoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/scanner.cpython-313.pyc +0 -0
- package/python/Lib/json/decoder.py +364 -0
- package/python/Lib/json/encoder.py +446 -0
- package/python/Lib/json/scanner.py +73 -0
- package/python/Lib/json/tool.py +90 -0
- package/python/Lib/keyword.py +64 -0
- package/python/Lib/linecache.py +236 -0
- package/python/Lib/locale.py +1987 -0
- package/python/Lib/logging/__init__.py +2330 -0
- package/python/Lib/logging/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/config.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/handlers.cpython-313.pyc +0 -0
- package/python/Lib/logging/config.py +1080 -0
- package/python/Lib/logging/handlers.py +1629 -0
- package/python/Lib/lzma.py +364 -0
- package/python/Lib/mailbox.py +2219 -0
- package/python/Lib/mimetypes.py +679 -0
- package/python/Lib/modulefinder.py +671 -0
- package/python/Lib/multiprocessing/__init__.py +37 -0
- package/python/Lib/multiprocessing/connection.py +1216 -0
- package/python/Lib/multiprocessing/context.py +383 -0
- package/python/Lib/multiprocessing/dummy/__init__.py +126 -0
- package/python/Lib/multiprocessing/dummy/connection.py +75 -0
- package/python/Lib/multiprocessing/forkserver.py +373 -0
- package/python/Lib/multiprocessing/heap.py +337 -0
- package/python/Lib/multiprocessing/managers.py +1397 -0
- package/python/Lib/multiprocessing/pool.py +957 -0
- package/python/Lib/multiprocessing/popen_fork.py +97 -0
- package/python/Lib/multiprocessing/popen_forkserver.py +74 -0
- package/python/Lib/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/Lib/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/Lib/multiprocessing/process.py +436 -0
- package/python/Lib/multiprocessing/queues.py +399 -0
- package/python/Lib/multiprocessing/reduction.py +281 -0
- package/python/Lib/multiprocessing/resource_sharer.py +154 -0
- package/python/Lib/multiprocessing/resource_tracker.py +499 -0
- package/python/Lib/multiprocessing/shared_memory.py +544 -0
- package/python/Lib/multiprocessing/sharedctypes.py +240 -0
- package/python/Lib/multiprocessing/spawn.py +307 -0
- package/python/Lib/multiprocessing/synchronize.py +404 -0
- package/python/Lib/multiprocessing/util.py +562 -0
- package/python/Lib/netrc.py +199 -0
- package/python/Lib/ntpath.py +872 -0
- package/python/Lib/nturl2path.py +69 -0
- package/python/Lib/numbers.py +427 -0
- package/python/Lib/opcode.py +115 -0
- package/python/Lib/operator.py +467 -0
- package/python/Lib/optparse.py +1681 -0
- package/python/Lib/os.py +1184 -0
- package/python/Lib/pathlib/__init__.py +12 -0
- package/python/Lib/pathlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_local.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/_abc.py +930 -0
- package/python/Lib/pathlib/_local.py +861 -0
- package/python/Lib/pdb.py +2550 -0
- package/python/Lib/pickle.py +1860 -0
- package/python/Lib/pickletools.py +2904 -0
- package/python/Lib/pkgutil.py +529 -0
- package/python/Lib/platform.py +1454 -0
- package/python/Lib/plistlib.py +948 -0
- package/python/Lib/poplib.py +477 -0
- package/python/Lib/posixpath.py +578 -0
- package/python/Lib/pprint.py +658 -0
- package/python/Lib/profile.py +616 -0
- package/python/Lib/pstats.py +778 -0
- package/python/Lib/pty.py +211 -0
- package/python/Lib/py_compile.py +212 -0
- package/python/Lib/pyclbr.py +314 -0
- package/python/Lib/pydoc.py +2861 -0
- package/python/Lib/queue.py +383 -0
- package/python/Lib/quopri.py +237 -0
- package/python/Lib/random.py +1078 -0
- package/python/Lib/re/__init__.py +428 -0
- package/python/Lib/re/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_casefix.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_compiler.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_constants.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/re/_casefix.py +106 -0
- package/python/Lib/re/_compiler.py +768 -0
- package/python/Lib/re/_constants.py +222 -0
- package/python/Lib/re/_parser.py +1081 -0
- package/python/Lib/reprlib.py +230 -0
- package/python/Lib/rlcompleter.py +222 -0
- package/python/Lib/runpy.py +326 -0
- package/python/Lib/sched.py +167 -0
- package/python/Lib/secrets.py +71 -0
- package/python/Lib/selectors.py +603 -0
- package/python/Lib/shelve.py +250 -0
- package/python/Lib/shlex.py +345 -0
- package/python/Lib/shutil.py +1569 -0
- package/python/Lib/signal.py +94 -0
- package/python/Lib/site.py +773 -0
- package/python/Lib/smtplib.py +1123 -0
- package/python/Lib/socket.py +988 -0
- package/python/Lib/socketserver.py +863 -0
- package/python/Lib/sqlite3/__init__.py +70 -0
- package/python/Lib/sqlite3/__main__.py +139 -0
- package/python/Lib/sqlite3/dbapi2.py +108 -0
- package/python/Lib/sqlite3/dump.py +118 -0
- package/python/Lib/sre_compile.py +7 -0
- package/python/Lib/sre_constants.py +7 -0
- package/python/Lib/sre_parse.py +7 -0
- package/python/Lib/ssl.py +1529 -0
- package/python/Lib/stat.py +212 -0
- package/python/Lib/statistics.py +1817 -0
- package/python/Lib/string.py +314 -0
- package/python/Lib/stringprep.py +272 -0
- package/python/Lib/struct.py +15 -0
- package/python/Lib/subprocess.py +2258 -0
- package/python/Lib/symtable.py +414 -0
- package/python/Lib/sysconfig/__init__.py +734 -0
- package/python/Lib/sysconfig/__main__.py +248 -0
- package/python/Lib/sysconfig/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tabnanny.py +340 -0
- package/python/Lib/tarfile.py +3136 -0
- package/python/Lib/tempfile.py +958 -0
- package/python/Lib/textwrap.py +497 -0
- package/python/Lib/this.py +28 -0
- package/python/Lib/threading.py +1602 -0
- package/python/Lib/timeit.py +381 -0
- package/python/Lib/token.py +141 -0
- package/python/Lib/tokenize.py +592 -0
- package/python/Lib/tomllib/__init__.py +10 -0
- package/python/Lib/tomllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_re.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_types.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/_parser.py +703 -0
- package/python/Lib/tomllib/_re.py +107 -0
- package/python/Lib/tomllib/_types.py +10 -0
- package/python/Lib/tomllib/mypy.ini +15 -0
- package/python/Lib/trace.py +754 -0
- package/python/Lib/traceback.py +1639 -0
- package/python/Lib/tracemalloc.py +560 -0
- package/python/Lib/tty.py +73 -0
- package/python/Lib/types.py +346 -0
- package/python/Lib/typing.py +3846 -0
- package/python/Lib/unittest/__init__.py +80 -0
- package/python/Lib/unittest/__main__.py +18 -0
- package/python/Lib/unittest/_log.py +86 -0
- package/python/Lib/unittest/async_case.py +146 -0
- package/python/Lib/unittest/case.py +1478 -0
- package/python/Lib/unittest/loader.py +460 -0
- package/python/Lib/unittest/main.py +280 -0
- package/python/Lib/unittest/mock.py +3189 -0
- package/python/Lib/unittest/result.py +256 -0
- package/python/Lib/unittest/runner.py +292 -0
- package/python/Lib/unittest/signals.py +71 -0
- package/python/Lib/unittest/suite.py +379 -0
- package/python/Lib/unittest/util.py +170 -0
- package/python/Lib/urllib/__init__.py +0 -0
- package/python/Lib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/error.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/request.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/response.cpython-313.pyc +0 -0
- package/python/Lib/urllib/error.py +74 -0
- package/python/Lib/urllib/parse.py +1264 -0
- package/python/Lib/urllib/request.py +2796 -0
- package/python/Lib/urllib/response.py +84 -0
- package/python/Lib/urllib/robotparser.py +363 -0
- package/python/Lib/uuid.py +784 -0
- package/python/Lib/warnings.py +735 -0
- package/python/Lib/wave.py +665 -0
- package/python/Lib/weakref.py +674 -0
- package/python/Lib/webbrowser.py +724 -0
- package/python/Lib/wsgiref/__init__.py +25 -0
- package/python/Lib/wsgiref/handlers.py +575 -0
- package/python/Lib/wsgiref/headers.py +192 -0
- package/python/Lib/wsgiref/simple_server.py +161 -0
- package/python/Lib/wsgiref/types.py +54 -0
- package/python/Lib/wsgiref/util.py +159 -0
- package/python/Lib/wsgiref/validate.py +438 -0
- package/python/Lib/xml/__init__.py +20 -0
- package/python/Lib/xml/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/dom/NodeFilter.py +27 -0
- package/python/Lib/xml/dom/__init__.py +140 -0
- package/python/Lib/xml/dom/domreg.py +99 -0
- package/python/Lib/xml/dom/expatbuilder.py +962 -0
- package/python/Lib/xml/dom/minicompat.py +109 -0
- package/python/Lib/xml/dom/minidom.py +2024 -0
- package/python/Lib/xml/dom/pulldom.py +336 -0
- package/python/Lib/xml/dom/xmlbuilder.py +389 -0
- package/python/Lib/xml/etree/ElementInclude.py +186 -0
- package/python/Lib/xml/etree/ElementPath.py +430 -0
- package/python/Lib/xml/etree/ElementTree.py +2116 -0
- package/python/Lib/xml/etree/__init__.py +33 -0
- package/python/Lib/xml/etree/cElementTree.py +3 -0
- package/python/Lib/xml/parsers/__init__.py +8 -0
- package/python/Lib/xml/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/__pycache__/expat.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/expat.py +8 -0
- package/python/Lib/xml/sax/__init__.py +94 -0
- package/python/Lib/xml/sax/_exceptions.py +127 -0
- package/python/Lib/xml/sax/expatreader.py +454 -0
- package/python/Lib/xml/sax/handler.py +387 -0
- package/python/Lib/xml/sax/saxutils.py +369 -0
- package/python/Lib/xml/sax/xmlreader.py +378 -0
- package/python/Lib/xmlrpc/__init__.py +1 -0
- package/python/Lib/xmlrpc/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/client.py +1503 -0
- package/python/Lib/xmlrpc/server.py +1002 -0
- package/python/Lib/zipapp.py +229 -0
- package/python/Lib/zipfile/__init__.py +2391 -0
- package/python/Lib/zipfile/__main__.py +4 -0
- package/python/Lib/zipfile/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__init__.py +452 -0
- package/python/Lib/zipfile/_path/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/glob.py +113 -0
- package/python/Lib/zipimport.py +803 -0
- package/python/Lib/zoneinfo/__init__.py +34 -0
- package/python/Lib/zoneinfo/_common.py +172 -0
- package/python/Lib/zoneinfo/_tzpath.py +189 -0
- package/python/Lib/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
- package/python/python.exe +0 -0
- package/python/python3.dll +0 -0
- package/python/python313.dll +0 -0
- package/python/pythonw.exe +0 -0
- package/python/vcruntime140.dll +0 -0
- package/python/vcruntime140_1.dll +0 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import atexit
|
|
2
|
+
import errno
|
|
3
|
+
import os
|
|
4
|
+
import selectors
|
|
5
|
+
import signal
|
|
6
|
+
import socket
|
|
7
|
+
import struct
|
|
8
|
+
import sys
|
|
9
|
+
import threading
|
|
10
|
+
import warnings
|
|
11
|
+
|
|
12
|
+
from . import connection
|
|
13
|
+
from . import process
|
|
14
|
+
from .context import reduction
|
|
15
|
+
from . import resource_tracker
|
|
16
|
+
from . import spawn
|
|
17
|
+
from . import util
|
|
18
|
+
|
|
19
|
+
__all__ = ['ensure_running', 'get_inherited_fds', 'connect_to_new_process',
|
|
20
|
+
'set_forkserver_preload']
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
#
|
|
24
|
+
#
|
|
25
|
+
|
|
26
|
+
MAXFDS_TO_SEND = 256
|
|
27
|
+
SIGNED_STRUCT = struct.Struct('q') # large enough for pid_t
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Forkserver class
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
class ForkServer(object):
|
|
34
|
+
|
|
35
|
+
def __init__(self):
|
|
36
|
+
self._forkserver_address = None
|
|
37
|
+
self._forkserver_alive_fd = None
|
|
38
|
+
self._forkserver_pid = None
|
|
39
|
+
self._inherited_fds = None
|
|
40
|
+
self._lock = threading.Lock()
|
|
41
|
+
self._preload_modules = ['__main__']
|
|
42
|
+
|
|
43
|
+
def _stop(self):
|
|
44
|
+
# Method used by unit tests to stop the server
|
|
45
|
+
with self._lock:
|
|
46
|
+
self._stop_unlocked()
|
|
47
|
+
|
|
48
|
+
def _stop_unlocked(self):
|
|
49
|
+
if self._forkserver_pid is None:
|
|
50
|
+
return
|
|
51
|
+
|
|
52
|
+
# close the "alive" file descriptor asks the server to stop
|
|
53
|
+
os.close(self._forkserver_alive_fd)
|
|
54
|
+
self._forkserver_alive_fd = None
|
|
55
|
+
|
|
56
|
+
os.waitpid(self._forkserver_pid, 0)
|
|
57
|
+
self._forkserver_pid = None
|
|
58
|
+
|
|
59
|
+
if not util.is_abstract_socket_namespace(self._forkserver_address):
|
|
60
|
+
os.unlink(self._forkserver_address)
|
|
61
|
+
self._forkserver_address = None
|
|
62
|
+
|
|
63
|
+
def set_forkserver_preload(self, modules_names):
|
|
64
|
+
'''Set list of module names to try to load in forkserver process.'''
|
|
65
|
+
if not all(type(mod) is str for mod in modules_names):
|
|
66
|
+
raise TypeError('module_names must be a list of strings')
|
|
67
|
+
self._preload_modules = modules_names
|
|
68
|
+
|
|
69
|
+
def get_inherited_fds(self):
|
|
70
|
+
'''Return list of fds inherited from parent process.
|
|
71
|
+
|
|
72
|
+
This returns None if the current process was not started by fork
|
|
73
|
+
server.
|
|
74
|
+
'''
|
|
75
|
+
return self._inherited_fds
|
|
76
|
+
|
|
77
|
+
def connect_to_new_process(self, fds):
|
|
78
|
+
'''Request forkserver to create a child process.
|
|
79
|
+
|
|
80
|
+
Returns a pair of fds (status_r, data_w). The calling process can read
|
|
81
|
+
the child process's pid and (eventually) its returncode from status_r.
|
|
82
|
+
The calling process should write to data_w the pickled preparation and
|
|
83
|
+
process data.
|
|
84
|
+
'''
|
|
85
|
+
self.ensure_running()
|
|
86
|
+
if len(fds) + 4 >= MAXFDS_TO_SEND:
|
|
87
|
+
raise ValueError('too many fds')
|
|
88
|
+
with socket.socket(socket.AF_UNIX) as client:
|
|
89
|
+
client.connect(self._forkserver_address)
|
|
90
|
+
parent_r, child_w = os.pipe()
|
|
91
|
+
child_r, parent_w = os.pipe()
|
|
92
|
+
allfds = [child_r, child_w, self._forkserver_alive_fd,
|
|
93
|
+
resource_tracker.getfd()]
|
|
94
|
+
allfds += fds
|
|
95
|
+
try:
|
|
96
|
+
reduction.sendfds(client, allfds)
|
|
97
|
+
return parent_r, parent_w
|
|
98
|
+
except:
|
|
99
|
+
os.close(parent_r)
|
|
100
|
+
os.close(parent_w)
|
|
101
|
+
raise
|
|
102
|
+
finally:
|
|
103
|
+
os.close(child_r)
|
|
104
|
+
os.close(child_w)
|
|
105
|
+
|
|
106
|
+
def ensure_running(self):
|
|
107
|
+
'''Make sure that a fork server is running.
|
|
108
|
+
|
|
109
|
+
This can be called from any process. Note that usually a child
|
|
110
|
+
process will just reuse the forkserver started by its parent, so
|
|
111
|
+
ensure_running() will do nothing.
|
|
112
|
+
'''
|
|
113
|
+
with self._lock:
|
|
114
|
+
resource_tracker.ensure_running()
|
|
115
|
+
if self._forkserver_pid is not None:
|
|
116
|
+
# forkserver was launched before, is it still running?
|
|
117
|
+
pid, status = os.waitpid(self._forkserver_pid, os.WNOHANG)
|
|
118
|
+
if not pid:
|
|
119
|
+
# still alive
|
|
120
|
+
return
|
|
121
|
+
# dead, launch it again
|
|
122
|
+
os.close(self._forkserver_alive_fd)
|
|
123
|
+
self._forkserver_address = None
|
|
124
|
+
self._forkserver_alive_fd = None
|
|
125
|
+
self._forkserver_pid = None
|
|
126
|
+
|
|
127
|
+
# gh-144503: sys_argv is passed as real argv elements after the
|
|
128
|
+
# ``-c cmd`` rather than repr'd into main_kws so that a large
|
|
129
|
+
# parent sys.argv cannot push the single ``-c`` command string
|
|
130
|
+
# over the OS per-argument length limit (MAX_ARG_STRLEN on Linux).
|
|
131
|
+
# The child sees them as sys.argv[1:].
|
|
132
|
+
cmd = ('import sys; '
|
|
133
|
+
'from multiprocessing.forkserver import main; '
|
|
134
|
+
'main(%d, %d, %r, sys_argv=sys.argv[1:], **%r)')
|
|
135
|
+
|
|
136
|
+
main_kws = {}
|
|
137
|
+
sys_argv = None
|
|
138
|
+
if self._preload_modules:
|
|
139
|
+
data = spawn.get_preparation_data('ignore')
|
|
140
|
+
if 'sys_path' in data:
|
|
141
|
+
main_kws['sys_path'] = data['sys_path']
|
|
142
|
+
if 'init_main_from_path' in data:
|
|
143
|
+
main_kws['main_path'] = data['init_main_from_path']
|
|
144
|
+
if 'sys_argv' in data:
|
|
145
|
+
sys_argv = data['sys_argv']
|
|
146
|
+
|
|
147
|
+
with socket.socket(socket.AF_UNIX) as listener:
|
|
148
|
+
address = connection.arbitrary_address('AF_UNIX')
|
|
149
|
+
listener.bind(address)
|
|
150
|
+
if not util.is_abstract_socket_namespace(address):
|
|
151
|
+
os.chmod(address, 0o600)
|
|
152
|
+
listener.listen()
|
|
153
|
+
|
|
154
|
+
# all client processes own the write end of the "alive" pipe;
|
|
155
|
+
# when they all terminate the read end becomes ready.
|
|
156
|
+
alive_r, alive_w = os.pipe()
|
|
157
|
+
try:
|
|
158
|
+
fds_to_pass = [listener.fileno(), alive_r]
|
|
159
|
+
cmd %= (listener.fileno(), alive_r, self._preload_modules,
|
|
160
|
+
main_kws)
|
|
161
|
+
exe = spawn.get_executable()
|
|
162
|
+
args = [exe] + util._args_from_interpreter_flags()
|
|
163
|
+
args += ['-c', cmd]
|
|
164
|
+
if sys_argv is not None:
|
|
165
|
+
args += sys_argv
|
|
166
|
+
pid = util.spawnv_passfds(exe, args, fds_to_pass)
|
|
167
|
+
except:
|
|
168
|
+
os.close(alive_w)
|
|
169
|
+
raise
|
|
170
|
+
finally:
|
|
171
|
+
os.close(alive_r)
|
|
172
|
+
self._forkserver_address = address
|
|
173
|
+
self._forkserver_alive_fd = alive_w
|
|
174
|
+
self._forkserver_pid = pid
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
#
|
|
178
|
+
#
|
|
179
|
+
|
|
180
|
+
def main(listener_fd, alive_r, preload, main_path=None, sys_path=None,
|
|
181
|
+
*, sys_argv=None):
|
|
182
|
+
'''Run forkserver.'''
|
|
183
|
+
if preload:
|
|
184
|
+
if sys_argv is not None:
|
|
185
|
+
sys.argv[:] = sys_argv
|
|
186
|
+
if sys_path is not None:
|
|
187
|
+
sys.path[:] = sys_path
|
|
188
|
+
if '__main__' in preload and main_path is not None:
|
|
189
|
+
process.current_process()._inheriting = True
|
|
190
|
+
try:
|
|
191
|
+
spawn.import_main_path(main_path)
|
|
192
|
+
finally:
|
|
193
|
+
del process.current_process()._inheriting
|
|
194
|
+
for modname in preload:
|
|
195
|
+
try:
|
|
196
|
+
__import__(modname)
|
|
197
|
+
except ImportError:
|
|
198
|
+
pass
|
|
199
|
+
|
|
200
|
+
# gh-135335: flush stdout/stderr in case any of the preloaded modules
|
|
201
|
+
# wrote to them, otherwise children might inherit buffered data
|
|
202
|
+
util._flush_std_streams()
|
|
203
|
+
|
|
204
|
+
util._close_stdin()
|
|
205
|
+
|
|
206
|
+
sig_r, sig_w = os.pipe()
|
|
207
|
+
os.set_blocking(sig_r, False)
|
|
208
|
+
os.set_blocking(sig_w, False)
|
|
209
|
+
|
|
210
|
+
def sigchld_handler(*_unused):
|
|
211
|
+
# Dummy signal handler, doesn't do anything
|
|
212
|
+
pass
|
|
213
|
+
|
|
214
|
+
handlers = {
|
|
215
|
+
# unblocking SIGCHLD allows the wakeup fd to notify our event loop
|
|
216
|
+
signal.SIGCHLD: sigchld_handler,
|
|
217
|
+
# protect the process from ^C
|
|
218
|
+
signal.SIGINT: signal.SIG_IGN,
|
|
219
|
+
}
|
|
220
|
+
old_handlers = {sig: signal.signal(sig, val)
|
|
221
|
+
for (sig, val) in handlers.items()}
|
|
222
|
+
|
|
223
|
+
# calling os.write() in the Python signal handler is racy
|
|
224
|
+
signal.set_wakeup_fd(sig_w)
|
|
225
|
+
|
|
226
|
+
# map child pids to client fds
|
|
227
|
+
pid_to_fd = {}
|
|
228
|
+
|
|
229
|
+
with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \
|
|
230
|
+
selectors.DefaultSelector() as selector:
|
|
231
|
+
_forkserver._forkserver_address = listener.getsockname()
|
|
232
|
+
|
|
233
|
+
selector.register(listener, selectors.EVENT_READ)
|
|
234
|
+
selector.register(alive_r, selectors.EVENT_READ)
|
|
235
|
+
selector.register(sig_r, selectors.EVENT_READ)
|
|
236
|
+
|
|
237
|
+
while True:
|
|
238
|
+
try:
|
|
239
|
+
while True:
|
|
240
|
+
rfds = [key.fileobj for (key, events) in selector.select()]
|
|
241
|
+
if rfds:
|
|
242
|
+
break
|
|
243
|
+
|
|
244
|
+
if alive_r in rfds:
|
|
245
|
+
# EOF because no more client processes left
|
|
246
|
+
assert os.read(alive_r, 1) == b'', "Not at EOF?"
|
|
247
|
+
raise SystemExit
|
|
248
|
+
|
|
249
|
+
if sig_r in rfds:
|
|
250
|
+
# Got SIGCHLD
|
|
251
|
+
os.read(sig_r, 65536) # exhaust
|
|
252
|
+
while True:
|
|
253
|
+
# Scan for child processes
|
|
254
|
+
try:
|
|
255
|
+
pid, sts = os.waitpid(-1, os.WNOHANG)
|
|
256
|
+
except ChildProcessError:
|
|
257
|
+
break
|
|
258
|
+
if pid == 0:
|
|
259
|
+
break
|
|
260
|
+
child_w = pid_to_fd.pop(pid, None)
|
|
261
|
+
if child_w is not None:
|
|
262
|
+
returncode = os.waitstatus_to_exitcode(sts)
|
|
263
|
+
|
|
264
|
+
# Send exit code to client process
|
|
265
|
+
try:
|
|
266
|
+
write_signed(child_w, returncode)
|
|
267
|
+
except BrokenPipeError:
|
|
268
|
+
# client vanished
|
|
269
|
+
pass
|
|
270
|
+
os.close(child_w)
|
|
271
|
+
else:
|
|
272
|
+
# This shouldn't happen really
|
|
273
|
+
warnings.warn('forkserver: waitpid returned '
|
|
274
|
+
'unexpected pid %d' % pid)
|
|
275
|
+
|
|
276
|
+
if listener in rfds:
|
|
277
|
+
# Incoming fork request
|
|
278
|
+
with listener.accept()[0] as s:
|
|
279
|
+
# Receive fds from client
|
|
280
|
+
fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1)
|
|
281
|
+
if len(fds) > MAXFDS_TO_SEND:
|
|
282
|
+
raise RuntimeError(
|
|
283
|
+
"Too many ({0:n}) fds to send".format(
|
|
284
|
+
len(fds)))
|
|
285
|
+
child_r, child_w, *fds = fds
|
|
286
|
+
s.close()
|
|
287
|
+
pid = os.fork()
|
|
288
|
+
if pid == 0:
|
|
289
|
+
# Child
|
|
290
|
+
code = 1
|
|
291
|
+
try:
|
|
292
|
+
listener.close()
|
|
293
|
+
selector.close()
|
|
294
|
+
unused_fds = [alive_r, child_w, sig_r, sig_w]
|
|
295
|
+
unused_fds.extend(pid_to_fd.values())
|
|
296
|
+
atexit._clear()
|
|
297
|
+
atexit.register(util._exit_function)
|
|
298
|
+
code = _serve_one(child_r, fds,
|
|
299
|
+
unused_fds,
|
|
300
|
+
old_handlers)
|
|
301
|
+
except Exception:
|
|
302
|
+
sys.excepthook(*sys.exc_info())
|
|
303
|
+
sys.stderr.flush()
|
|
304
|
+
finally:
|
|
305
|
+
atexit._run_exitfuncs()
|
|
306
|
+
os._exit(code)
|
|
307
|
+
else:
|
|
308
|
+
# Send pid to client process
|
|
309
|
+
try:
|
|
310
|
+
write_signed(child_w, pid)
|
|
311
|
+
except BrokenPipeError:
|
|
312
|
+
# client vanished
|
|
313
|
+
pass
|
|
314
|
+
pid_to_fd[pid] = child_w
|
|
315
|
+
os.close(child_r)
|
|
316
|
+
for fd in fds:
|
|
317
|
+
os.close(fd)
|
|
318
|
+
|
|
319
|
+
except OSError as e:
|
|
320
|
+
if e.errno != errno.ECONNABORTED:
|
|
321
|
+
raise
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def _serve_one(child_r, fds, unused_fds, handlers):
|
|
325
|
+
# close unnecessary stuff and reset signal handlers
|
|
326
|
+
signal.set_wakeup_fd(-1)
|
|
327
|
+
for sig, val in handlers.items():
|
|
328
|
+
signal.signal(sig, val)
|
|
329
|
+
for fd in unused_fds:
|
|
330
|
+
os.close(fd)
|
|
331
|
+
|
|
332
|
+
(_forkserver._forkserver_alive_fd,
|
|
333
|
+
resource_tracker._resource_tracker._fd,
|
|
334
|
+
*_forkserver._inherited_fds) = fds
|
|
335
|
+
|
|
336
|
+
# Run process object received over pipe
|
|
337
|
+
parent_sentinel = os.dup(child_r)
|
|
338
|
+
code = spawn._main(child_r, parent_sentinel)
|
|
339
|
+
|
|
340
|
+
return code
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
#
|
|
344
|
+
# Read and write signed numbers
|
|
345
|
+
#
|
|
346
|
+
|
|
347
|
+
def read_signed(fd):
|
|
348
|
+
data = b''
|
|
349
|
+
length = SIGNED_STRUCT.size
|
|
350
|
+
while len(data) < length:
|
|
351
|
+
s = os.read(fd, length - len(data))
|
|
352
|
+
if not s:
|
|
353
|
+
raise EOFError('unexpected EOF')
|
|
354
|
+
data += s
|
|
355
|
+
return SIGNED_STRUCT.unpack(data)[0]
|
|
356
|
+
|
|
357
|
+
def write_signed(fd, n):
|
|
358
|
+
msg = SIGNED_STRUCT.pack(n)
|
|
359
|
+
while msg:
|
|
360
|
+
nbytes = os.write(fd, msg)
|
|
361
|
+
if nbytes == 0:
|
|
362
|
+
raise RuntimeError('should not get here')
|
|
363
|
+
msg = msg[nbytes:]
|
|
364
|
+
|
|
365
|
+
#
|
|
366
|
+
#
|
|
367
|
+
#
|
|
368
|
+
|
|
369
|
+
_forkserver = ForkServer()
|
|
370
|
+
ensure_running = _forkserver.ensure_running
|
|
371
|
+
get_inherited_fds = _forkserver.get_inherited_fds
|
|
372
|
+
connect_to_new_process = _forkserver.connect_to_new_process
|
|
373
|
+
set_forkserver_preload = _forkserver.set_forkserver_preload
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Module which supports allocation of memory from an mmap
|
|
3
|
+
#
|
|
4
|
+
# multiprocessing/heap.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006-2008, R Oudkerk
|
|
7
|
+
# Licensed to PSF under a Contributor Agreement.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
import bisect
|
|
11
|
+
from collections import defaultdict
|
|
12
|
+
import mmap
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
import tempfile
|
|
16
|
+
import threading
|
|
17
|
+
|
|
18
|
+
from .context import reduction, assert_spawning
|
|
19
|
+
from . import util
|
|
20
|
+
|
|
21
|
+
__all__ = ['BufferWrapper']
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Inheritable class which wraps an mmap, and from which blocks can be allocated
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
if sys.platform == 'win32':
|
|
28
|
+
|
|
29
|
+
import _winapi
|
|
30
|
+
|
|
31
|
+
class Arena(object):
|
|
32
|
+
"""
|
|
33
|
+
A shared memory area backed by anonymous memory (Windows).
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
_rand = tempfile._RandomNameSequence()
|
|
37
|
+
|
|
38
|
+
def __init__(self, size):
|
|
39
|
+
self.size = size
|
|
40
|
+
for i in range(100):
|
|
41
|
+
name = 'pym-%d-%s' % (os.getpid(), next(self._rand))
|
|
42
|
+
buf = mmap.mmap(-1, size, tagname=name)
|
|
43
|
+
if _winapi.GetLastError() == 0:
|
|
44
|
+
break
|
|
45
|
+
# We have reopened a preexisting mmap.
|
|
46
|
+
buf.close()
|
|
47
|
+
else:
|
|
48
|
+
raise FileExistsError('Cannot find name for new mmap')
|
|
49
|
+
self.name = name
|
|
50
|
+
self.buffer = buf
|
|
51
|
+
self._state = (self.size, self.name)
|
|
52
|
+
|
|
53
|
+
def __getstate__(self):
|
|
54
|
+
assert_spawning(self)
|
|
55
|
+
return self._state
|
|
56
|
+
|
|
57
|
+
def __setstate__(self, state):
|
|
58
|
+
self.size, self.name = self._state = state
|
|
59
|
+
# Reopen existing mmap
|
|
60
|
+
self.buffer = mmap.mmap(-1, self.size, tagname=self.name)
|
|
61
|
+
# XXX Temporarily preventing buildbot failures while determining
|
|
62
|
+
# XXX the correct long-term fix. See issue 23060
|
|
63
|
+
#assert _winapi.GetLastError() == _winapi.ERROR_ALREADY_EXISTS
|
|
64
|
+
|
|
65
|
+
else:
|
|
66
|
+
|
|
67
|
+
class Arena(object):
|
|
68
|
+
"""
|
|
69
|
+
A shared memory area backed by a temporary file (POSIX).
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
if sys.platform == 'linux':
|
|
73
|
+
_dir_candidates = ['/dev/shm']
|
|
74
|
+
else:
|
|
75
|
+
_dir_candidates = []
|
|
76
|
+
|
|
77
|
+
def __init__(self, size, fd=-1):
|
|
78
|
+
self.size = size
|
|
79
|
+
self.fd = fd
|
|
80
|
+
if fd == -1:
|
|
81
|
+
# Arena is created anew (if fd != -1, it means we're coming
|
|
82
|
+
# from rebuild_arena() below)
|
|
83
|
+
self.fd, name = tempfile.mkstemp(
|
|
84
|
+
prefix='pym-%d-'%os.getpid(),
|
|
85
|
+
dir=self._choose_dir(size))
|
|
86
|
+
os.unlink(name)
|
|
87
|
+
util.Finalize(self, os.close, (self.fd,))
|
|
88
|
+
os.ftruncate(self.fd, size)
|
|
89
|
+
self.buffer = mmap.mmap(self.fd, self.size)
|
|
90
|
+
|
|
91
|
+
def _choose_dir(self, size):
|
|
92
|
+
# Choose a non-storage backed directory if possible,
|
|
93
|
+
# to improve performance
|
|
94
|
+
for d in self._dir_candidates:
|
|
95
|
+
st = os.statvfs(d)
|
|
96
|
+
if st.f_bavail * st.f_frsize >= size: # enough free space?
|
|
97
|
+
return d
|
|
98
|
+
return util.get_temp_dir()
|
|
99
|
+
|
|
100
|
+
def reduce_arena(a):
|
|
101
|
+
if a.fd == -1:
|
|
102
|
+
raise ValueError('Arena is unpicklable because '
|
|
103
|
+
'forking was enabled when it was created')
|
|
104
|
+
return rebuild_arena, (a.size, reduction.DupFd(a.fd))
|
|
105
|
+
|
|
106
|
+
def rebuild_arena(size, dupfd):
|
|
107
|
+
return Arena(size, dupfd.detach())
|
|
108
|
+
|
|
109
|
+
reduction.register(Arena, reduce_arena)
|
|
110
|
+
|
|
111
|
+
#
|
|
112
|
+
# Class allowing allocation of chunks of memory from arenas
|
|
113
|
+
#
|
|
114
|
+
|
|
115
|
+
class Heap(object):
|
|
116
|
+
|
|
117
|
+
# Minimum malloc() alignment
|
|
118
|
+
_alignment = 8
|
|
119
|
+
|
|
120
|
+
_DISCARD_FREE_SPACE_LARGER_THAN = 4 * 1024 ** 2 # 4 MB
|
|
121
|
+
_DOUBLE_ARENA_SIZE_UNTIL = 4 * 1024 ** 2
|
|
122
|
+
|
|
123
|
+
def __init__(self, size=mmap.PAGESIZE):
|
|
124
|
+
self._lastpid = os.getpid()
|
|
125
|
+
self._lock = threading.Lock()
|
|
126
|
+
# Current arena allocation size
|
|
127
|
+
self._size = size
|
|
128
|
+
# A sorted list of available block sizes in arenas
|
|
129
|
+
self._lengths = []
|
|
130
|
+
|
|
131
|
+
# Free block management:
|
|
132
|
+
# - map each block size to a list of `(Arena, start, stop)` blocks
|
|
133
|
+
self._len_to_seq = {}
|
|
134
|
+
# - map `(Arena, start)` tuple to the `(Arena, start, stop)` block
|
|
135
|
+
# starting at that offset
|
|
136
|
+
self._start_to_block = {}
|
|
137
|
+
# - map `(Arena, stop)` tuple to the `(Arena, start, stop)` block
|
|
138
|
+
# ending at that offset
|
|
139
|
+
self._stop_to_block = {}
|
|
140
|
+
|
|
141
|
+
# Map arenas to their `(Arena, start, stop)` blocks in use
|
|
142
|
+
self._allocated_blocks = defaultdict(set)
|
|
143
|
+
self._arenas = []
|
|
144
|
+
|
|
145
|
+
# List of pending blocks to free - see comment in free() below
|
|
146
|
+
self._pending_free_blocks = []
|
|
147
|
+
|
|
148
|
+
# Statistics
|
|
149
|
+
self._n_mallocs = 0
|
|
150
|
+
self._n_frees = 0
|
|
151
|
+
|
|
152
|
+
@staticmethod
|
|
153
|
+
def _roundup(n, alignment):
|
|
154
|
+
# alignment must be a power of 2
|
|
155
|
+
mask = alignment - 1
|
|
156
|
+
return (n + mask) & ~mask
|
|
157
|
+
|
|
158
|
+
def _new_arena(self, size):
|
|
159
|
+
# Create a new arena with at least the given *size*
|
|
160
|
+
length = self._roundup(max(self._size, size), mmap.PAGESIZE)
|
|
161
|
+
# We carve larger and larger arenas, for efficiency, until we
|
|
162
|
+
# reach a large-ish size (roughly L3 cache-sized)
|
|
163
|
+
if self._size < self._DOUBLE_ARENA_SIZE_UNTIL:
|
|
164
|
+
self._size *= 2
|
|
165
|
+
util.info('allocating a new mmap of length %d', length)
|
|
166
|
+
arena = Arena(length)
|
|
167
|
+
self._arenas.append(arena)
|
|
168
|
+
return (arena, 0, length)
|
|
169
|
+
|
|
170
|
+
def _discard_arena(self, arena):
|
|
171
|
+
# Possibly delete the given (unused) arena
|
|
172
|
+
length = arena.size
|
|
173
|
+
# Reusing an existing arena is faster than creating a new one, so
|
|
174
|
+
# we only reclaim space if it's large enough.
|
|
175
|
+
if length < self._DISCARD_FREE_SPACE_LARGER_THAN:
|
|
176
|
+
return
|
|
177
|
+
blocks = self._allocated_blocks.pop(arena)
|
|
178
|
+
assert not blocks
|
|
179
|
+
del self._start_to_block[(arena, 0)]
|
|
180
|
+
del self._stop_to_block[(arena, length)]
|
|
181
|
+
self._arenas.remove(arena)
|
|
182
|
+
seq = self._len_to_seq[length]
|
|
183
|
+
seq.remove((arena, 0, length))
|
|
184
|
+
if not seq:
|
|
185
|
+
del self._len_to_seq[length]
|
|
186
|
+
self._lengths.remove(length)
|
|
187
|
+
|
|
188
|
+
def _malloc(self, size):
|
|
189
|
+
# returns a large enough block -- it might be much larger
|
|
190
|
+
i = bisect.bisect_left(self._lengths, size)
|
|
191
|
+
if i == len(self._lengths):
|
|
192
|
+
return self._new_arena(size)
|
|
193
|
+
else:
|
|
194
|
+
length = self._lengths[i]
|
|
195
|
+
seq = self._len_to_seq[length]
|
|
196
|
+
block = seq.pop()
|
|
197
|
+
if not seq:
|
|
198
|
+
del self._len_to_seq[length], self._lengths[i]
|
|
199
|
+
|
|
200
|
+
(arena, start, stop) = block
|
|
201
|
+
del self._start_to_block[(arena, start)]
|
|
202
|
+
del self._stop_to_block[(arena, stop)]
|
|
203
|
+
return block
|
|
204
|
+
|
|
205
|
+
def _add_free_block(self, block):
|
|
206
|
+
# make block available and try to merge with its neighbours in the arena
|
|
207
|
+
(arena, start, stop) = block
|
|
208
|
+
|
|
209
|
+
try:
|
|
210
|
+
prev_block = self._stop_to_block[(arena, start)]
|
|
211
|
+
except KeyError:
|
|
212
|
+
pass
|
|
213
|
+
else:
|
|
214
|
+
start, _ = self._absorb(prev_block)
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
next_block = self._start_to_block[(arena, stop)]
|
|
218
|
+
except KeyError:
|
|
219
|
+
pass
|
|
220
|
+
else:
|
|
221
|
+
_, stop = self._absorb(next_block)
|
|
222
|
+
|
|
223
|
+
block = (arena, start, stop)
|
|
224
|
+
length = stop - start
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
self._len_to_seq[length].append(block)
|
|
228
|
+
except KeyError:
|
|
229
|
+
self._len_to_seq[length] = [block]
|
|
230
|
+
bisect.insort(self._lengths, length)
|
|
231
|
+
|
|
232
|
+
self._start_to_block[(arena, start)] = block
|
|
233
|
+
self._stop_to_block[(arena, stop)] = block
|
|
234
|
+
|
|
235
|
+
def _absorb(self, block):
|
|
236
|
+
# deregister this block so it can be merged with a neighbour
|
|
237
|
+
(arena, start, stop) = block
|
|
238
|
+
del self._start_to_block[(arena, start)]
|
|
239
|
+
del self._stop_to_block[(arena, stop)]
|
|
240
|
+
|
|
241
|
+
length = stop - start
|
|
242
|
+
seq = self._len_to_seq[length]
|
|
243
|
+
seq.remove(block)
|
|
244
|
+
if not seq:
|
|
245
|
+
del self._len_to_seq[length]
|
|
246
|
+
self._lengths.remove(length)
|
|
247
|
+
|
|
248
|
+
return start, stop
|
|
249
|
+
|
|
250
|
+
def _remove_allocated_block(self, block):
|
|
251
|
+
arena, start, stop = block
|
|
252
|
+
blocks = self._allocated_blocks[arena]
|
|
253
|
+
blocks.remove((start, stop))
|
|
254
|
+
if not blocks:
|
|
255
|
+
# Arena is entirely free, discard it from this process
|
|
256
|
+
self._discard_arena(arena)
|
|
257
|
+
|
|
258
|
+
def _free_pending_blocks(self):
|
|
259
|
+
# Free all the blocks in the pending list - called with the lock held.
|
|
260
|
+
while True:
|
|
261
|
+
try:
|
|
262
|
+
block = self._pending_free_blocks.pop()
|
|
263
|
+
except IndexError:
|
|
264
|
+
break
|
|
265
|
+
self._add_free_block(block)
|
|
266
|
+
self._remove_allocated_block(block)
|
|
267
|
+
|
|
268
|
+
def free(self, block):
|
|
269
|
+
# free a block returned by malloc()
|
|
270
|
+
# Since free() can be called asynchronously by the GC, it could happen
|
|
271
|
+
# that it's called while self._lock is held: in that case,
|
|
272
|
+
# self._lock.acquire() would deadlock (issue #12352). To avoid that, a
|
|
273
|
+
# trylock is used instead, and if the lock can't be acquired
|
|
274
|
+
# immediately, the block is added to a list of blocks to be freed
|
|
275
|
+
# synchronously sometimes later from malloc() or free(), by calling
|
|
276
|
+
# _free_pending_blocks() (appending and retrieving from a list is not
|
|
277
|
+
# strictly thread-safe but under CPython it's atomic thanks to the GIL).
|
|
278
|
+
if os.getpid() != self._lastpid:
|
|
279
|
+
raise ValueError(
|
|
280
|
+
"My pid ({0:n}) is not last pid {1:n}".format(
|
|
281
|
+
os.getpid(),self._lastpid))
|
|
282
|
+
if not self._lock.acquire(False):
|
|
283
|
+
# can't acquire the lock right now, add the block to the list of
|
|
284
|
+
# pending blocks to free
|
|
285
|
+
self._pending_free_blocks.append(block)
|
|
286
|
+
else:
|
|
287
|
+
# we hold the lock
|
|
288
|
+
try:
|
|
289
|
+
self._n_frees += 1
|
|
290
|
+
self._free_pending_blocks()
|
|
291
|
+
self._add_free_block(block)
|
|
292
|
+
self._remove_allocated_block(block)
|
|
293
|
+
finally:
|
|
294
|
+
self._lock.release()
|
|
295
|
+
|
|
296
|
+
def malloc(self, size):
|
|
297
|
+
# return a block of right size (possibly rounded up)
|
|
298
|
+
if size < 0:
|
|
299
|
+
raise ValueError("Size {0:n} out of range".format(size))
|
|
300
|
+
if sys.maxsize <= size:
|
|
301
|
+
raise OverflowError("Size {0:n} too large".format(size))
|
|
302
|
+
if os.getpid() != self._lastpid:
|
|
303
|
+
self.__init__() # reinitialize after fork
|
|
304
|
+
with self._lock:
|
|
305
|
+
self._n_mallocs += 1
|
|
306
|
+
# allow pending blocks to be marked available
|
|
307
|
+
self._free_pending_blocks()
|
|
308
|
+
size = self._roundup(max(size, 1), self._alignment)
|
|
309
|
+
(arena, start, stop) = self._malloc(size)
|
|
310
|
+
real_stop = start + size
|
|
311
|
+
if real_stop < stop:
|
|
312
|
+
# if the returned block is larger than necessary, mark
|
|
313
|
+
# the remainder available
|
|
314
|
+
self._add_free_block((arena, real_stop, stop))
|
|
315
|
+
self._allocated_blocks[arena].add((start, real_stop))
|
|
316
|
+
return (arena, start, real_stop)
|
|
317
|
+
|
|
318
|
+
#
|
|
319
|
+
# Class wrapping a block allocated out of a Heap -- can be inherited by child process
|
|
320
|
+
#
|
|
321
|
+
|
|
322
|
+
class BufferWrapper(object):
|
|
323
|
+
|
|
324
|
+
_heap = Heap()
|
|
325
|
+
|
|
326
|
+
def __init__(self, size):
|
|
327
|
+
if size < 0:
|
|
328
|
+
raise ValueError("Size {0:n} out of range".format(size))
|
|
329
|
+
if sys.maxsize <= size:
|
|
330
|
+
raise OverflowError("Size {0:n} too large".format(size))
|
|
331
|
+
block = BufferWrapper._heap.malloc(size)
|
|
332
|
+
self._state = (block, size)
|
|
333
|
+
util.Finalize(self, BufferWrapper._heap.free, args=(block,))
|
|
334
|
+
|
|
335
|
+
def create_memoryview(self):
|
|
336
|
+
(arena, start, stop), size = self._state
|
|
337
|
+
return memoryview(arena.buffer)[start:start+size]
|