Cover Letter Detail
Show a cover letter.
GET /api/covers/10349/?format=api
{ "id": 10349, "url": "https://patchwork.libcamera.org/api/covers/10349/?format=api", "web_url": "https://patchwork.libcamera.org/cover/10349/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20201106103707.49660-1-paul.elder@ideasonboard.com>", "date": "2020-11-06T10:36:30", "name": "[libcamera-devel,v4,00/37] IPA isolation implementation", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/cover/10349/mbox/", "series": [ { "id": 1448, "url": "https://patchwork.libcamera.org/api/series/1448/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1448", "date": "2020-11-06T10:36:30", "name": "IPA isolation implementation", "version": 4, "mbox": "https://patchwork.libcamera.org/series/1448/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/covers/10349/comments/", "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 83F0FBE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 6 Nov 2020 10:37:22 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 09F1B62D24;\n\tFri, 6 Nov 2020 11:37:22 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9DE5D629A6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 6 Nov 2020 11:37:20 +0100 (CET)", "from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CE07CA19;\n\tFri, 6 Nov 2020 11:37:18 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"sWBkBZzV\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1604659040;\n\tbh=J9Vvly5qLJS04tzT2mgBm9PNXAh3Swjb7yfUcLuroV4=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=sWBkBZzVY2SNkiDQOQ58SQa2GsRCj7NEtFCctvBvECrtMEx0/JnwRWwcr/BJhB9eZ\n\t1C4gLeeFybUHs5TeNqo5/cZXCo9DHSjB7NIBqdSFEoAQc/kw8WBiAIC9g48E8pwhfd\n\tkENM4Sj6W7JzlYFAc6W3Qg5H8fTV2cj3WRxCvzrM=", "From": "Paul Elder <paul.elder@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 6 Nov 2020 19:36:30 +0900", "Message-Id": "<20201106103707.49660-1-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.27.0", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v4 00/37] IPA isolation implementation", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "This patchset implements IPA isolation, and is fully plumbed and\nrunnable on all pipeline handlers. This also includes code\ngenerators for the IPA proxies, and headers and serializers for custom\ndata structures and functions. Unlike the RFC, this patch series is\nstructured like a normal patch series, in order that should be merged.\nThe only exception is patches 13/37-33/37, which must be squashed to\navoid bisection breakage, and are only kept separate to ease review.\n\nTo see samples of generated code (without running this), see the RFC\n\"IPA isolation example, with IPC, fully plumbed\".\n\nTo restate the problem, we have two goals:\n- to be able to run IPAs isolated in a separate process\n- the isolation must be transparent to both the pipeline handler and\n the IPA\nDuring design of the IPC mechanism, we realized that we could support\nboth custom fuctions and custom data structures, which would be a lot\nnicer than the tedious manual de/serialization that we had before with\nIPAOperationData.\n\nThe architecture of the whole thing is as follows:\n\npipeline handler -> IPAProxyRPi --thread--> IPARPi\n \\\n \\-> IPAIPC --IPC--> IPAProxyRPiWorker -> IPARPi\n\nWhere the pipeline author defines the interface between the pipeline\nhandler and the IPA, as well as any data structures. Based on this,\nheaders, de/serializers, and the proxy (including the worker) will be\ngenerated.\n\nPatch 1/37 imports mojo directly from the chromium repos, with some\nbig things pruned. Patches 4/37 to 11/37 add the meat of this IPC and\ncustom IPA interface mechanisms. Patches 13/37 to 33/37 are modifications\nin the rest of libcamera to make the whole mechanism work, and must be\nsquashed together to avoid bisection breakage. Patches 34/37 and 35/37\nadd tests for the serializer and IPC components of this series. Newly in\nv4, patches 36/37 adds an IPA guide, and 37/37 adds a test to test\ngenerated serializers and headers.\n\nPatch 25/37 may be of interest, as it shows how one would write the\ninterface and data definition. In v2 I have customized the raspberrypi\nmojom file to take advantage of the freedom in definition the IPA\ninterface and data structures (as opposed to v1, where it was\npractically a direct translation of IPAOperationData). In v3 I have\nadded namespace support to the data definition, and this is reflected in\nits usage.\n\nIn v2 I have added some rules to the mojom file, such as start(),\nstop(), and init() are required, along with the main and callback\ninterfaces. These are documented in core.mojom in patch 24/37 and\nenforced in the code generator in patch 04/37. core.mojom is a new\naddition in v2, and is where common mojom \"structs\" (which represent\nlibcamera objects) and IPA interface definition documentaion are.\n\nPatch 26/37 is also noteworthy, as it shows how one would use the\ninterface that has been defined. Since the headers and proxies are\nautogenerated, there isn't a patch where the generated code can be seen,\nhowever.\n\nPatches 27/37 and 28/37 also define mojom files and use them, but are\nfor vimc and rkisp1, respectively. These will also give an idea on how\nthe mojom definition looks and how it will be used.\n\nChanges in v4:\n- add IPA guide\n- add test for header and serializer generation\n- fix style in generated code and IPADataSerializer\n- add segfault protections in read/append helpers in de/serializer\n- rename generated header and serializer\n- rename IPA callback interface to IPA event interface\n\nChanges in v3:\n- add support for namespaces in the mojom file\n - note that they individually must not collide with existing\n namespaces (enforced by the C++ compiler)\n- move IPAIPCUnixSocket helper functions away from global and into the\n class\n- add SPDX and copyright to python scripts\n- add parser.py to wrap the mojo parser\n- make IPADataSerializer definition a bit cleaner with reimplemented POD\n manipulation functions\n- expand mojom documentation in core.mojom\n\nChanges in v2:\n- upgrade documentation\n- fix documentation compiling\n- plumb the new IPC system through the other pipelines\n- fix the issue where editing jinja templates wouldn't trigger\n recompile\n- enforce IPA interface rules in code generator\n- fix previously-untriggered code generation bugs\n- add de/serializers for all primitive types, string, and const\n ControlList\n- customized the RPi IPA interface\n- add licenses\n- add tests\n\n\n\nPaul Elder (37):\n utils: ipc: import mojo\n README, meson: Add dependency on ply and jinja2 for IPA interface\n generation\n libcamera: Update dep5 to specify license for mojo\n utils: ipc: add templates for code generation for IPC mechanism\n utils: ipc: add generator script\n utils: ipc: add parser script\n Documentation: skip generating documentation for generated code\n libcamera: Add IPADataSerializer\n libcamera: Add IPAIPC\n libcamera: Add IPAIPC implementation based on unix socket\n meson: ipa, proxy: Generate headers and proxy with mojo\n ipa: raspberrypi: meson: Add dependency on generated headers\n libcamera: IPAModule: Replace ipa_context with IPAInterface\n libcamera: ipa_context_wrapper: Remove ipa_context_wrapper\n libcamera: IPAProxy: Remove stop() override\n libcamera: IPAProxy: Add isolate parameter to create()\n libcamera: PipelineHandler: Remove IPA from base class\n libcamera: IPAInterface: Remove all functions from IPAInterface\n libcamera: IPAInterface: make ipaCreate return IPAInterface\n libcamera: IPAInterface: remove ipa_context and functions from\n documentation\n libcamera: IPAManager: Fetch IPAProxy corresponding to pipeline\n libcamera: IPAManager: add isolation flag to proxy creation\n libcamera: IPAManager: Make createIPA return proxy directly\n ipa: Add core.mojom\n ipa: raspberrypi: Add mojom data definition file\n libcamera: pipeline, ipa: raspberrypi: Use new data definition\n libcamera: pipeline, ipa: vimc: Support the new IPC mechanism\n libcamera: pipeline, ipa: rkisp1: Support the new IPC mechanism\n libcamera: IPAProxy: Remove registration mechanism\n libcamera: proxy: Remove IPAProxyLinux and IPAProxyThread\n ipa: remove libipa\n tests: ipa_interface_test: Update to use new createIPA\n tests: Remove IPA wrappers test\n tests: Add IPADataSerializer test\n tests: Add test for IPAIPCUnixSocket\n Documentation: Add IPA writers guide\n tests: Test IPA serializer generation\n\n .reuse/dep5 | 6 +\n Documentation/Doxyfile.in | 7 +-\n Documentation/guides/ipa.rst | 112 +\n Documentation/index.rst | 1 +\n Documentation/meson.build | 3 +-\n README.rst | 2 +-\n .../libcamera/internal/ipa_context_wrapper.h | 52 -\n .../libcamera/internal/ipa_data_serializer.h | 1004 +++++++++\n include/libcamera/internal/ipa_ipc.h | 42 +\n .../libcamera/internal/ipa_ipc_unixsocket.h | 62 +\n include/libcamera/internal/ipa_manager.h | 31 +-\n include/libcamera/internal/ipa_module.h | 4 +-\n include/libcamera/internal/ipa_proxy.h | 31 -\n include/libcamera/internal/meson.build | 1 -\n include/libcamera/internal/pipeline_handler.h | 1 -\n include/libcamera/ipa/core.mojom | 18 +\n include/libcamera/ipa/ipa_interface.h | 126 +-\n include/libcamera/ipa/meson.build | 94 +\n include/libcamera/ipa/raspberrypi.h | 58 +-\n include/libcamera/ipa/raspberrypi.mojom | 158 ++\n include/libcamera/ipa/rkisp1.h | 18 +-\n include/libcamera/ipa/rkisp1.mojom | 42 +\n include/libcamera/ipa/vimc.h | 8 +\n include/libcamera/ipa/vimc.mojom | 12 +\n src/ipa/libipa/ipa_interface_wrapper.cpp | 285 ---\n src/ipa/libipa/ipa_interface_wrapper.h | 61 -\n src/ipa/libipa/meson.build | 15 -\n src/ipa/meson.build | 2 -\n src/ipa/raspberrypi/meson.build | 4 +-\n src/ipa/raspberrypi/raspberrypi.cpp | 162 +-\n src/ipa/rkisp1/meson.build | 5 +-\n src/ipa/rkisp1/rkisp1.cpp | 55 +-\n src/ipa/vimc/meson.build | 5 +-\n src/ipa/vimc/vimc.cpp | 18 +-\n src/libcamera/ipa_context_wrapper.cpp | 297 ---\n src/libcamera/ipa_data_serializer.cpp | 178 ++\n src/libcamera/ipa_interface.cpp | 517 +----\n src/libcamera/ipa_ipc.cpp | 110 +\n src/libcamera/ipa_ipc_unixsocket.cpp | 213 ++\n src/libcamera/ipa_manager.cpp | 47 +-\n src/libcamera/ipa_module.cpp | 10 +-\n src/libcamera/ipa_proxy.cpp | 101 -\n src/libcamera/meson.build | 5 +-\n .../pipeline/raspberrypi/raspberrypi.cpp | 193 +-\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 44 +-\n src/libcamera/pipeline/vimc/vimc.cpp | 8 +-\n src/libcamera/pipeline_handler.cpp | 8 -\n src/libcamera/proxy/ipa_proxy_linux.cpp | 103 -\n src/libcamera/proxy/ipa_proxy_thread.cpp | 172 --\n src/libcamera/proxy/meson.build | 21 +-\n .../proxy/worker/ipa_proxy_linux_worker.cpp | 90 -\n src/libcamera/proxy/worker/meson.build | 23 +-\n test/ipa/ipa_interface_test.cpp | 8 +-\n test/ipa/ipa_wrappers_test.cpp | 452 ----\n test/ipa/meson.build | 7 +-\n test/ipc/meson.build | 3 +-\n test/ipc/unixsocket_ipc.cpp | 238 ++\n .../generated_serializer_test.cpp | 130 ++\n .../generated_serializer/meson.build | 49 +\n .../generated_serializer/vimc.mojom | 23 +\n .../ipa_data_serializer_test.cpp | 464 ++++\n test/serialization/meson.build | 5 +-\n utils/ipc/generate.py | 29 +\n .../libcamera_templates/meson.build | 11 +\n .../module_ipa_interface.h.tmpl | 113 +\n .../module_ipa_proxy.cpp.tmpl | 238 ++\n .../module_ipa_proxy.h.tmpl | 118 +\n .../module_ipa_proxy_worker.cpp.tmpl | 187 ++\n .../module_ipa_serializer.h.tmpl | 44 +\n .../libcamera_templates/proxy_functions.tmpl | 205 ++\n .../libcamera_templates/serializer.tmpl | 280 +++\n utils/ipc/generators/meson.build | 3 +\n .../generators/mojom_libcamera_generator.py | 488 +++++\n utils/ipc/meson.build | 16 +\n utils/ipc/mojo/public/LICENSE | 27 +\n utils/ipc/mojo/public/tools/.style.yapf | 6 +\n utils/ipc/mojo/public/tools/BUILD.gn | 18 +\n utils/ipc/mojo/public/tools/bindings/BUILD.gn | 108 +\n .../ipc/mojo/public/tools/bindings/README.md | 816 +++++++\n .../chromium_bindings_configuration.gni | 51 +\n .../tools/bindings/compile_typescript.py | 27 +\n .../tools/bindings/concatenate-files.py | 54 +\n ...concatenate_and_replace_closure_exports.py | 73 +\n .../bindings/format_typemap_generator_args.py | 36 +\n .../tools/bindings/gen_data_files_list.py | 52 +\n .../tools/bindings/generate_type_mappings.py | 187 ++\n .../ipc/mojo/public/tools/bindings/mojom.gni | 1941 +++++++++++++++++\n .../bindings/mojom_bindings_generator.py | 390 ++++\n .../mojom_bindings_generator_unittest.py | 62 +\n .../tools/bindings/mojom_types_downgrader.py | 119 +\n .../tools/bindings/validate_typemap_config.py | 57 +\n utils/ipc/mojo/public/tools/mojom/README.md | 14 +\n .../mojom/check_stable_mojom_compatibility.py | 170 ++\n ...eck_stable_mojom_compatibility_unittest.py | 260 +++\n .../mojo/public/tools/mojom/const_unittest.py | 90 +\n .../mojo/public/tools/mojom/enum_unittest.py | 92 +\n .../mojo/public/tools/mojom/mojom/BUILD.gn | 43 +\n .../mojo/public/tools/mojom/mojom/__init__.py | 0\n .../mojo/public/tools/mojom/mojom/error.py | 28 +\n .../mojo/public/tools/mojom/mojom/fileutil.py | 45 +\n .../tools/mojom/mojom/fileutil_unittest.py | 40 +\n .../tools/mojom/mojom/generate/__init__.py | 0\n .../mojom/mojom/generate/constant_resolver.py | 93 +\n .../tools/mojom/mojom/generate/generator.py | 325 +++\n .../mojom/generate/generator_unittest.py | 74 +\n .../tools/mojom/mojom/generate/module.py | 1635 ++++++++++++++\n .../mojom/mojom/generate/module_unittest.py | 31 +\n .../public/tools/mojom/mojom/generate/pack.py | 258 +++\n .../mojom/mojom/generate/pack_unittest.py | 225 ++\n .../mojom/mojom/generate/template_expander.py | 83 +\n .../tools/mojom/mojom/generate/translate.py | 854 ++++++++\n .../mojom/generate/translate_unittest.py | 73 +\n .../tools/mojom/mojom/parse/__init__.py | 0\n .../public/tools/mojom/mojom/parse/ast.py | 427 ++++\n .../tools/mojom/mojom/parse/ast_unittest.py | 121 +\n .../mojom/mojom/parse/conditional_features.py | 82 +\n .../parse/conditional_features_unittest.py | 233 ++\n .../public/tools/mojom/mojom/parse/lexer.py | 251 +++\n .../tools/mojom/mojom/parse/lexer_unittest.py | 198 ++\n .../public/tools/mojom/mojom/parse/parser.py | 488 +++++\n .../mojom/mojom/parse/parser_unittest.py | 1390 ++++++++++++\n .../mojo/public/tools/mojom/mojom_parser.py | 361 +++\n .../tools/mojom/mojom_parser_test_case.py | 73 +\n .../tools/mojom/mojom_parser_unittest.py | 171 ++\n .../tools/mojom/stable_attribute_unittest.py | 127 ++\n .../mojom/version_compatibility_unittest.py | 397 ++++\n .../public/tools/run_all_python_unittests.py | 28 +\n utils/ipc/parser.py | 20 +\n utils/ipc/tools/diagnosis/crbug_1001171.py | 51 +\n utils/meson.build | 1 +\n 130 files changed, 17964 insertions(+), 2668 deletions(-)\n create mode 100644 Documentation/guides/ipa.rst\n delete mode 100644 include/libcamera/internal/ipa_context_wrapper.h\n create mode 100644 include/libcamera/internal/ipa_data_serializer.h\n create mode 100644 include/libcamera/internal/ipa_ipc.h\n create mode 100644 include/libcamera/internal/ipa_ipc_unixsocket.h\n create mode 100644 include/libcamera/ipa/core.mojom\n create mode 100644 include/libcamera/ipa/raspberrypi.mojom\n create mode 100644 include/libcamera/ipa/rkisp1.mojom\n create mode 100644 include/libcamera/ipa/vimc.mojom\n delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.cpp\n delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.h\n delete mode 100644 src/ipa/libipa/meson.build\n delete mode 100644 src/libcamera/ipa_context_wrapper.cpp\n create mode 100644 src/libcamera/ipa_data_serializer.cpp\n create mode 100644 src/libcamera/ipa_ipc.cpp\n create mode 100644 src/libcamera/ipa_ipc_unixsocket.cpp\n delete mode 100644 src/libcamera/proxy/ipa_proxy_linux.cpp\n delete mode 100644 src/libcamera/proxy/ipa_proxy_thread.cpp\n delete mode 100644 src/libcamera/proxy/worker/ipa_proxy_linux_worker.cpp\n delete mode 100644 test/ipa/ipa_wrappers_test.cpp\n create mode 100644 test/ipc/unixsocket_ipc.cpp\n create mode 100644 test/serialization/generated_serializer/generated_serializer_test.cpp\n create mode 100644 test/serialization/generated_serializer/meson.build\n create mode 100644 test/serialization/generated_serializer/vimc.mojom\n create mode 100644 test/serialization/ipa_data_serializer_test.cpp\n create mode 100755 utils/ipc/generate.py\n create mode 100644 utils/ipc/generators/libcamera_templates/meson.build\n create mode 100644 utils/ipc/generators/libcamera_templates/module_ipa_interface.h.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/module_ipa_proxy_worker.cpp.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/proxy_functions.tmpl\n create mode 100644 utils/ipc/generators/libcamera_templates/serializer.tmpl\n create mode 100644 utils/ipc/generators/meson.build\n create mode 100644 utils/ipc/generators/mojom_libcamera_generator.py\n create mode 100644 utils/ipc/meson.build\n create mode 100644 utils/ipc/mojo/public/LICENSE\n create mode 100644 utils/ipc/mojo/public/tools/.style.yapf\n create mode 100644 utils/ipc/mojo/public/tools/BUILD.gn\n create mode 100644 utils/ipc/mojo/public/tools/bindings/BUILD.gn\n create mode 100644 utils/ipc/mojo/public/tools/bindings/README.md\n create mode 100644 utils/ipc/mojo/public/tools/bindings/chromium_bindings_configuration.gni\n create mode 100644 utils/ipc/mojo/public/tools/bindings/compile_typescript.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/concatenate-files.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/concatenate_and_replace_closure_exports.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/format_typemap_generator_args.py\n create mode 100644 utils/ipc/mojo/public/tools/bindings/gen_data_files_list.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/generate_type_mappings.py\n create mode 100644 utils/ipc/mojo/public/tools/bindings/mojom.gni\n create mode 100755 utils/ipc/mojo/public/tools/bindings/mojom_bindings_generator.py\n create mode 100644 utils/ipc/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/mojom_types_downgrader.py\n create mode 100755 utils/ipc/mojo/public/tools/bindings/validate_typemap_config.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/README.md\n create mode 100755 utils/ipc/mojo/public/tools/mojom/check_stable_mojom_compatibility.py\n create mode 100755 utils/ipc/mojo/public/tools/mojom/check_stable_mojom_compatibility_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/const_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/enum_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/BUILD.gn\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/__init__.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/error.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/fileutil.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/fileutil_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/__init__.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/constant_resolver.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/generator.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/generator_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/module.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/module_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/pack.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/pack_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/template_expander.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/translate.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/generate/translate_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/__init__.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/ast.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/ast_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/parser.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom/parse/parser_unittest.py\n create mode 100755 utils/ipc/mojo/public/tools/mojom/mojom_parser.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom_parser_test_case.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/mojom_parser_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/stable_attribute_unittest.py\n create mode 100644 utils/ipc/mojo/public/tools/mojom/version_compatibility_unittest.py\n create mode 100755 utils/ipc/mojo/public/tools/run_all_python_unittests.py\n create mode 100755 utils/ipc/parser.py\n create mode 100644 utils/ipc/tools/diagnosis/crbug_1001171.py" }