diff --git a/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.hpp b/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.hpp new file mode 100644 index 00000000000..55c1d7c7d3c --- /dev/null +++ b/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.hpp @@ -0,0 +1,57 @@ +// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +#ifndef IOX_POSH_POPO_REQUEST_DELETER_HPP +#define IOX_POSH_POPO_REQUEST_DELETER_HPP + +#include "iceoryx_posh/mepoo/chunk_header.hpp" +#include "iceoryx_posh/popo/rpc_header.hpp" + +namespace iox +{ +namespace popo +{ +/// +/// @brief The RequestDeleter struct is a custom deleter in functor form which releases loans to a request's +/// underlying memory chunk via the corresponding port. +/// Each port should create its own instance of this deleter struct. +/// @tparam Port is either the ClientPortUser or ServerPortUser and need to have a `releaseResponse` method +template +struct RequestDeleter +{ + public: + explicit RequestDeleter(Port& port) noexcept; + + /// @brief Handles deletion of the request. + /// @param[in] payload The pointer to the payload of the request. + template + void operator()(T* const payload) noexcept; + + /// @brief Handles deletion of the request. + /// @param[in] payload The pointer to the user-payload of the request. + template + void operator()(const T* const payload) const noexcept; + + private: + Port* m_port; +}; + +} // namespace popo +} // namespace iox + +#include "iceoryx_posh/internal/popo/request_deleter.inl" + +#endif // IOX_POSH_POPO_REQUEST_DELETER_HPP diff --git a/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.inl b/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.inl new file mode 100644 index 00000000000..fc04fe9308c --- /dev/null +++ b/iceoryx_posh/include/iceoryx_posh/internal/popo/request_deleter.inl @@ -0,0 +1,51 @@ +// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +#ifndef IOX_POSH_POPO_REQUEST_DELETER_INL +#define IOX_POSH_POPO_REQUEST_DELETER_INL + +#include "iceoryx_posh/internal/popo/request_deleter.hpp" + +namespace iox +{ +namespace popo +{ +template +RequestDeleter::RequestDeleter(Port& port) noexcept + : m_port(&port) +{ +} + +template +template +void RequestDeleter::operator()(T* const payload) noexcept +{ + auto* requestHeader = iox::popo::RequestHeader::fromPayload(payload); + m_port->releaseRequest(requestHeader); +} + +template +template +void RequestDeleter::operator()(const T* const payload) const noexcept +{ + const auto* requestHeader = iox::popo::RequestHeader::fromPayload(payload); + m_port->releaseRequest(requestHeader); +} + +} // namespace popo +} // namespace iox + +#endif // IOX_POSH_POPO_REQUEST_DELETER_INL diff --git a/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.hpp b/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.hpp new file mode 100644 index 00000000000..bd292c0cf09 --- /dev/null +++ b/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.hpp @@ -0,0 +1,57 @@ +// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +#ifndef IOX_POSH_POPO_RESPONSE_DELETER_HPP +#define IOX_POSH_POPO_RESPONSE_DELETER_HPP + +#include "iceoryx_posh/mepoo/chunk_header.hpp" +#include "iceoryx_posh/popo/rpc_header.hpp" + +namespace iox +{ +namespace popo +{ +/// +/// @brief The ResponseDeleter struct is a custom deleter in functor form which releases loans to a response's +/// underlying memory chunk via the corresponding port.. +/// Each port should create its own instance of this deleter struct. +/// @tparam Port is either the ClientPortUser or ServerPortUser and need to have a `releaseResponse` method +template +struct ResponseDeleter +{ + public: + explicit ResponseDeleter(Port& port) noexcept; + + /// @brief Handles deletion of the response. + /// @param[in] payload The pointer to the payload of the response. + template + void operator()(T* const payload) noexcept; + + /// @brief Handles deletion of the response. + /// @param[in] payload The pointer to the user-payload of the response. + template + void operator()(const T* const payload) const noexcept; + + private: + Port* m_port; +}; + +} // namespace popo +} // namespace iox + +#include "iceoryx_posh/internal/popo/response_deleter.inl" + +#endif // IOX_POSH_POPO_RESPONSE_DELETER_HPP diff --git a/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.inl b/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.inl new file mode 100644 index 00000000000..2c56f9c33f2 --- /dev/null +++ b/iceoryx_posh/include/iceoryx_posh/internal/popo/response_deleter.inl @@ -0,0 +1,51 @@ +// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +#ifndef IOX_POSH_POPO_RESPONSE_DELETER_INL +#define IOX_POSH_POPO_RESPONSE_DELETER_INL + +#include "iceoryx_posh/internal/popo/response_deleter.hpp" + +namespace iox +{ +namespace popo +{ +template +ResponseDeleter::ResponseDeleter(Port& port) noexcept + : m_port(&port) +{ +} + +template +template +void ResponseDeleter::operator()(T* const payload) noexcept +{ + auto* responseHeader = iox::popo::ResponseHeader::fromPayload(payload); + m_port->releaseResponse(responseHeader); +} + +template +template +void ResponseDeleter::operator()(const T* const payload) const noexcept +{ + const auto* responseHeader = iox::popo::ResponseHeader::fromPayload(payload); + m_port->releaseResponse(responseHeader); +} + +} // namespace popo +} // namespace iox + +#endif // IOX_POSH_POPO_RESPONSE_DELETER_INL