Skip to content

Commit

Permalink
iox-#27 Add RequestDeleter and ResponseDeleter
Browse files Browse the repository at this point in the history
  • Loading branch information
elBoberido committed Feb 15, 2022
1 parent 25cc39a commit fe7160b
Show file tree
Hide file tree
Showing 4 changed files with 216 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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 <typename Port>
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 <typename T>
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 <typename T>
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
Original file line number Diff line number Diff line change
@@ -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 <typename Port>
RequestDeleter<Port>::RequestDeleter(Port& port) noexcept
: m_port(&port)
{
}

template <typename Port>
template <typename T>
void RequestDeleter<Port>::operator()(T* const payload) noexcept
{
auto* requestHeader = iox::popo::RequestHeader::fromPayload(payload);
m_port->releaseRequest(requestHeader);
}

template <typename Port>
template <typename T>
void RequestDeleter<Port>::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
Original file line number Diff line number Diff line change
@@ -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 <typename Port>
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 <typename T>
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 <typename T>
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
Original file line number Diff line number Diff line change
@@ -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 <typename Port>
ResponseDeleter<Port>::ResponseDeleter(Port& port) noexcept
: m_port(&port)
{
}

template <typename Port>
template <typename T>
void ResponseDeleter<Port>::operator()(T* const payload) noexcept
{
auto* responseHeader = iox::popo::ResponseHeader::fromPayload(payload);
m_port->releaseResponse(responseHeader);
}

template <typename Port>
template <typename T>
void ResponseDeleter<Port>::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

0 comments on commit fe7160b

Please sign in to comment.