Patch Detail
Show a patch.
GET /api/patches/12065/?format=api
{ "id": 12065, "url": "https://patchwork.libcamera.org/api/patches/12065/?format=api", "web_url": "https://patchwork.libcamera.org/patch/12065/", "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": "<20210422080816.364948-2-paul.elder@ideasonboard.com>", "date": "2021-04-22T08:08:15", "name": "[libcamera-devel,v2,1/2] utils: ipc: Support types defined in core.mojom with skipHeader only", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "a65f0983d7336b4d4e3d67fbade4487f7dd553f2", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": { "id": 17, "url": "https://patchwork.libcamera.org/api/users/17/?format=api", "username": "epaul", "first_name": "Paul", "last_name": "Elder", "email": "paul.elder@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/12065/mbox/", "series": [ { "id": 1961, "url": "https://patchwork.libcamera.org/api/series/1961/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1961", "date": "2021-04-22T08:08:14", "name": "Fix support for core.mojom structs", "version": 2, "mbox": "https://patchwork.libcamera.org/series/1961/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/12065/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/12065/checks/", "tags": {}, "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 8BFE4BDB17\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 22 Apr 2021 08:08:39 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 447326885C;\n\tThu, 22 Apr 2021 10:08:39 +0200 (CEST)", "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 C558268848\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 22 Apr 2021 10:08:37 +0200 (CEST)", "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 1CB8E3EE;\n\tThu, 22 Apr 2021 10:08:35 +0200 (CEST)" ], "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=\"fRXDVN0R\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1619078917;\n\tbh=WVxoreeIGKky1RfKHnVJRAk804OdfMX+iJ2PtdhnyYA=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=fRXDVN0R9kZAYN5A8pq406ze8uCJFu2PCyLAp2KgFYYc2fN4SxpZDzOni/YGPALRf\n\ttX6rcXHHlWgLK2gnRhrqad1dH9EaMsuwDUSHGDAFGimhAtwlE4H6CGJXqAXPFBe580\n\tRTw1ZDE5qBtJEl5yWeNk6YC9x2wC3i7BdhHPwNYg=", "From": "Paul Elder <paul.elder@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Thu, 22 Apr 2021 17:08:15 +0900", "Message-Id": "<20210422080816.364948-2-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.27.0", "In-Reply-To": "<20210422080816.364948-1-paul.elder@ideasonboard.com>", "References": "<20210422080816.364948-1-paul.elder@ideasonboard.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v2 1/2] utils: ipc: Support types defined\n\tin core.mojom with skipHeader only", "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": "Previously, types that were defined in core.mojom with skipHeader only\nand no skipSerdes would cause serializer generation to fail due to the\ngenerated IPA namespace being used for mojom-defined types instead of\nthe libcamera namespace. This doesn't work because skipHeader means that\nthe type is defined in the libcamera (or some other) namespace\nelsewhere.\n\nFix this by using \"using namespace\" in the generated serializer header,\nso that mojom-defined IPA types can be used without the full namespace\nqualifier.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\nNo change in v2\n\n .../module_ipa_serializer.h.tmpl | 6 +++\n .../libcamera_templates/serializer.tmpl | 38 +++++++++----------\n 2 files changed, 24 insertions(+), 20 deletions(-)", "diff": "diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\nindex 64ae99dc..d0bac62d 100644\n--- a/utils/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n@@ -27,6 +27,12 @@\n \n namespace libcamera {\n \n+{%- if has_namespace %}\n+{% for ns in namespace -%}\n+using namespace {{ns}};\n+{% endfor %}\n+{%- endif %}\n+\n LOG_DECLARE_CATEGORY(IPADataSerializer)\n {% for struct in structs_nonempty %}\n template<>\ndiff --git a/utils/ipc/generators/libcamera_templates/serializer.tmpl b/utils/ipc/generators/libcamera_templates/serializer.tmpl\nindex af35b9e3..afabd8e3 100644\n--- a/utils/ipc/generators/libcamera_templates/serializer.tmpl\n+++ b/utils/ipc/generators/libcamera_templates/serializer.tmpl\n@@ -63,12 +63,10 @@\n \t{%- else %}\n \t\tstd::tie({{field.mojom_name}}, std::ignore) =\n \t{%- endif %}\n-\t{%- if field|is_array or field|is_map %}\n-\t\t\tIPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}}, cs);\n-\t{%- elif field|is_str %}\n+\t{%- if field|is_str %}\n \t\t\tIPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}});\n \t{%- else %}\n-\t\t\tIPADataSerializer<{{field|name_full(namespace)}}>::serialize(data.{{field.mojom_name}}, cs);\n+\t\t\tIPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}}, cs);\n \t{%- endif %}\n \t\tappendPOD<uint32_t>(retData, {{field.mojom_name}}.size());\n \t{%- if field|has_fd %}\n@@ -97,7 +95,7 @@\n \t\t{%- if field|is_pod %}\n \t\tret.{{field.mojom_name}} = IPADataSerializer<{{field|name}}>::deserialize(m, m + {{field_size}});\n \t\t{%- else %}\n-\t\tret.{{field.mojom_name}} = static_cast<{{field|name_full(namespace)}}>(IPADataSerializer<uint{{field|bit_width}}_t>::deserialize(m, m + {{field_size}}));\n+\t\tret.{{field.mojom_name}} = static_cast<{{field|name}}>(IPADataSerializer<uint{{field|bit_width}}_t>::deserialize(m, m + {{field_size}}));\n \t\t{%- endif %}\n \t{%- if not loop.last %}\n \t\tm += {{field_size}};\n@@ -150,11 +148,11 @@\n \t{%- elif field|has_fd and (field|is_array or field|is_map) %}\n \t\t\tIPADataSerializer<{{field|name}}>::deserialize(m, m + {{field.mojom_name}}Size, n, n + {{field.mojom_name}}FdsSize, cs);\n \t{%- elif field|has_fd and (not (field|is_array or field|is_map)) %}\n-\t\t\tIPADataSerializer<{{field|name_full(namespace)}}>::deserialize(m, m + {{field.mojom_name}}Size, n, n + {{field.mojom_name}}FdsSize, cs);\n+\t\t\tIPADataSerializer<{{field|name}}>::deserialize(m, m + {{field.mojom_name}}Size, n, n + {{field.mojom_name}}FdsSize, cs);\n \t{%- elif (not field|has_fd) and (field|is_array or field|is_map) %}\n \t\t\tIPADataSerializer<{{field|name}}>::deserialize(m, m + {{field.mojom_name}}Size, cs);\n \t{%- else %}\n-\t\t\tIPADataSerializer<{{field|name_full(namespace)}}>::deserialize(m, m + {{field.mojom_name}}Size, cs);\n+\t\t\tIPADataSerializer<{{field|name}}>::deserialize(m, m + {{field.mojom_name}}Size, cs);\n \t{%- endif %}\n \t{%- if not loop.last %}\n \t\tm += {{field_size}};\n@@ -178,7 +176,7 @@\n #}\n {%- macro serializer(struct, namespace) %}\n \tstatic std::tuple<std::vector<uint8_t>, std::vector<int32_t>>\n-\tserialize(const {{struct|name_full(namespace)}} &data,\n+\tserialize(const {{struct|name}} &data,\n {%- if struct|needs_control_serializer %}\n \t\t ControlSerializer *cs)\n {%- else %}\n@@ -208,7 +206,7 @@\n # \\a struct, in the case that \\a struct has file descriptors.\n #}\n {%- macro deserializer_fd(struct, namespace) %}\n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t> &data,\n \t\t std::vector<int32_t> &fds,\n {%- if struct|needs_control_serializer %}\n@@ -217,11 +215,11 @@\n \t\t ControlSerializer *cs = nullptr)\n {%- endif %}\n \t{\n-\t\treturn IPADataSerializer<{{struct|name_full(namespace)}}>::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);\n+\t\treturn IPADataSerializer<{{struct|name}}>::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);\n \t}\n \n {# \\todo Don't inline this function #}\n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t>::const_iterator dataBegin,\n \t\t std::vector<uint8_t>::const_iterator dataEnd,\n \t\t std::vector<int32_t>::const_iterator fdsBegin,\n@@ -232,7 +230,7 @@\n \t\t [[maybe_unused]] ControlSerializer *cs = nullptr)\n {%- endif %}\n \t{\n-\t\t{{struct|name_full(namespace)}} ret;\n+\t\t{{struct|name}} ret;\n \t\tstd::vector<uint8_t>::const_iterator m = dataBegin;\n \t\tstd::vector<int32_t>::const_iterator n = fdsBegin;\n \n@@ -253,22 +251,22 @@\n # deserializers with file descriptors.\n #}\n {%- macro deserializer_fd_simple(struct, namespace) %}\n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t> &data,\n \t\t [[maybe_unused]] std::vector<int32_t> &fds,\n \t\t ControlSerializer *cs = nullptr)\n \t{\n-\t\treturn IPADataSerializer<{{struct|name_full(namespace)}}>::deserialize(data.cbegin(), data.cend(), cs);\n+\t\treturn IPADataSerializer<{{struct|name}}>::deserialize(data.cbegin(), data.cend(), cs);\n \t}\n \n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t>::const_iterator dataBegin,\n \t\t std::vector<uint8_t>::const_iterator dataEnd,\n \t\t [[maybe_unused]] std::vector<int32_t>::const_iterator fdsBegin,\n \t\t [[maybe_unused]] std::vector<int32_t>::const_iterator fdsEnd,\n \t\t ControlSerializer *cs = nullptr)\n \t{\n-\t\treturn IPADataSerializer<{{struct|name_full(namespace)}}>::deserialize(dataBegin, dataEnd, cs);\n+\t\treturn IPADataSerializer<{{struct|name}}>::deserialize(dataBegin, dataEnd, cs);\n \t}\n {%- endmacro %}\n \n@@ -280,7 +278,7 @@\n # \\a struct, in the case that \\a struct does not have file descriptors.\n #}\n {%- macro deserializer_no_fd(struct, namespace) %}\n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t> &data,\n {%- if struct|needs_control_serializer %}\n \t\t ControlSerializer *cs)\n@@ -288,11 +286,11 @@\n \t\t ControlSerializer *cs = nullptr)\n {%- endif %}\n \t{\n-\t\treturn IPADataSerializer<{{struct|name_full(namespace)}}>::deserialize(data.cbegin(), data.cend(), cs);\n+\t\treturn IPADataSerializer<{{struct|name}}>::deserialize(data.cbegin(), data.cend(), cs);\n \t}\n \n {# \\todo Don't inline this function #}\n-\tstatic {{struct|name_full(namespace)}}\n+\tstatic {{struct|name}}\n \tdeserialize(std::vector<uint8_t>::const_iterator dataBegin,\n \t\t std::vector<uint8_t>::const_iterator dataEnd,\n {%- if struct|needs_control_serializer %}\n@@ -301,7 +299,7 @@\n \t\t [[maybe_unused]] ControlSerializer *cs = nullptr)\n {%- endif %}\n \t{\n-\t\t{{struct|name_full(namespace)}} ret;\n+\t\t{{struct|name}} ret;\n \t\tstd::vector<uint8_t>::const_iterator m = dataBegin;\n \n \t\tsize_t dataSize = std::distance(dataBegin, dataEnd);\n", "prefixes": [ "libcamera-devel", "v2", "1/2" ] }