diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2021-09-07 11:13:09 +0200 |
---|---|---|
committer | Jacopo Mondi <jacopo@jmondi.org> | 2021-09-27 14:39:15 +0200 |
commit | 11e9d192885d94cbe1e5d850315b8f2b4032d804 (patch) | |
tree | 102bc5be5c91b6461d193eeae16b2183052cb101 /test | |
parent | 23c2b8a9cacad72c405fbeea77d6b3f8cb865c98 (diff) |
libcamera: control_serializer: Separate the handles space
Two independent instances of the ControlSerializer class are in use at
the IPC boundaries, one in the Proxy class that serializes data from the
pipeline handler to the IPA, and one in the ProxyWorker which serializes
data in the opposite direction.
Each instance operates autonomously, without any centralized point of
control, and each one assigns a numerical handle to each ControlInfoMap
it serializes. This creates a risk of potential collision on the handle
values, as both instances will use the same numerical space and
are not aware of what handles has been already used by the instance "on
the other side".
To fix that, partition the handles numerical space by initializing the
control serializer with a seed according to the role of the component
that creates the serializer and increment the handle number by 2, to
avoid any collision risk.
While this is temporary and rather hacky solution, it solves an issue
with isolated IPA modules without too much complexity added.
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/serialization/control_serialization.cpp | 4 | ||||
-rw-r--r-- | test/serialization/ipa_data_serializer_test.cpp | 6 |
2 files changed, 5 insertions, 5 deletions
diff --git a/test/serialization/control_serialization.cpp b/test/serialization/control_serialization.cpp index 5ac9c4ed..a507d98a 100644 --- a/test/serialization/control_serialization.cpp +++ b/test/serialization/control_serialization.cpp @@ -30,8 +30,8 @@ protected: int run() override { - ControlSerializer serializer; - ControlSerializer deserializer; + ControlSerializer serializer(ControlSerializer::Role::Proxy); + ControlSerializer deserializer(ControlSerializer::Role::Worker); std::vector<uint8_t> infoData; std::vector<uint8_t> listData; diff --git a/test/serialization/ipa_data_serializer_test.cpp b/test/serialization/ipa_data_serializer_test.cpp index eca19a66..5fcdcb8e 100644 --- a/test/serialization/ipa_data_serializer_test.cpp +++ b/test/serialization/ipa_data_serializer_test.cpp @@ -162,7 +162,7 @@ private: int testControls() { - ControlSerializer cs; + ControlSerializer cs(ControlSerializer::Role::Proxy); const ControlInfoMap &infoMap = camera_->controls(); ControlList list = generateControlList(infoMap); @@ -195,7 +195,7 @@ private: int testVector() { - ControlSerializer cs; + ControlSerializer cs(ControlSerializer::Role::Proxy); /* * We don't test FileDescriptor serdes because it dup()s, so we @@ -265,7 +265,7 @@ private: int testMap() { - ControlSerializer cs; + ControlSerializer cs(ControlSerializer::Role::Proxy); /* * Realistically, only string and integral keys. |