forked from ros2/rclcpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Circular Message Cache implementation for snapshot feature (ros2#844)
* Add circular message cache buffer implementation to be used for in-memory snapshot mode Signed-off-by: Cameron Miller <cammlle@amazon.com> Co-authored-by: Emerson Knapp <emerson.b.knapp@gmail.com>
- Loading branch information
1 parent
ef40da9
commit 622b0ad
Showing
16 changed files
with
622 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
74 changes: 74 additions & 0 deletions
74
rosbag2_cpp/include/rosbag2_cpp/cache/cache_buffer_interface.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// Copyright 2021 Amazon.com, Inc. or its affiliates. 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. | ||
|
||
#ifndef ROSBAG2_CPP__CACHE__CACHE_BUFFER_INTERFACE_HPP_ | ||
#define ROSBAG2_CPP__CACHE__CACHE_BUFFER_INTERFACE_HPP_ | ||
|
||
#include <memory> | ||
#include <vector> | ||
|
||
#include "rosbag2_cpp/visibility_control.hpp" | ||
#include "rosbag2_storage/serialized_bag_message.hpp" | ||
|
||
namespace rosbag2_cpp | ||
{ | ||
namespace cache | ||
{ | ||
/** | ||
* This class provides the interface for all CacheBuffer implementations. The | ||
* role of these buffers is store messages that are received via topic subscriptions | ||
* before they are written to the bagfile. | ||
* | ||
* Any class that implements CacheBufferInterface is reponsible for handling | ||
* synchronization that is needed for the buffer to operate properly. | ||
*/ | ||
class ROSBAG2_CPP_PUBLIC CacheBufferInterface | ||
{ | ||
public: | ||
using buffer_element_t = std::shared_ptr<const rosbag2_storage::SerializedBagMessage>; | ||
virtual ~CacheBufferInterface() {} | ||
|
||
/** | ||
* Pushes a SerializedBagMessage into the cache buffer. | ||
* | ||
* \param msg SerializedBagMessage to add to the buffer. | ||
* \return whether message was successfully added to the cache. | ||
*/ | ||
virtual bool push(buffer_element_t msg) = 0; | ||
|
||
/** | ||
* Clears the buffer by removing all remaining messages. | ||
*/ | ||
virtual void clear() = 0; | ||
|
||
/** | ||
* Check the buffer message count. | ||
* | ||
* \return number of elements in the buffer. | ||
*/ | ||
virtual size_t size() = 0; | ||
|
||
/** | ||
* Get the data/messages stored in the buffer. This should only be | ||
* called once no more messages are being added to the buffer. | ||
* | ||
* \return a vector containing messages in the buffer. | ||
*/ | ||
virtual const std::vector<buffer_element_t> & data() = 0; | ||
}; | ||
|
||
} // namespace cache | ||
} // namespace rosbag2_cpp | ||
|
||
#endif // ROSBAG2_CPP__CACHE__CACHE_BUFFER_INTERFACE_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
rosbag2_cpp/include/rosbag2_cpp/cache/circular_message_cache.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
// Copyright 2021 Amazon.com, Inc. or its affiliates. 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. | ||
|
||
#ifndef ROSBAG2_CPP__CACHE__CIRCULAR_MESSAGE_CACHE_HPP_ | ||
#define ROSBAG2_CPP__CACHE__CIRCULAR_MESSAGE_CACHE_HPP_ | ||
|
||
#include <memory> | ||
#include <mutex> | ||
#include <string> | ||
|
||
#include "rosbag2_cpp/cache/message_cache_circular_buffer.hpp" | ||
#include "rosbag2_cpp/cache/message_cache_interface.hpp" | ||
#include "rosbag2_cpp/cache/cache_buffer_interface.hpp" | ||
#include "rosbag2_cpp/visibility_control.hpp" | ||
|
||
#include "rosbag2_storage/serialized_bag_message.hpp" | ||
|
||
// This is necessary because of using stl types here. It is completely safe, because | ||
// a) the member is not accessible from the outside | ||
// b) there are no inline functions. | ||
#ifdef _WIN32 | ||
# pragma warning(push) | ||
# pragma warning(disable:4251) | ||
#endif | ||
|
||
namespace rosbag2_cpp | ||
{ | ||
namespace cache | ||
{ | ||
|
||
class ROSBAG2_CPP_PUBLIC CircularMessageCache | ||
: public MessageCacheInterface | ||
{ | ||
public: | ||
explicit CircularMessageCache(size_t max_buffer_size); | ||
|
||
/// Puts msg into circular buffer, replacing the oldest msg when buffer is full | ||
void push(std::shared_ptr<const rosbag2_storage::SerializedBagMessage> msg) override; | ||
|
||
/// get current buffer to consume | ||
std::shared_ptr<CacheBufferInterface> consumer_buffer() override; | ||
|
||
/// Swap the primary and secondary buffer before consumption. | ||
/// NOTE: consumer_buffer() should be called sequentially after | ||
/// swap_buffer() to ensure expected behavior. Calling swap_buffer() | ||
/// while accessing consumer_buffer() will be undefined behavior. | ||
void swap_buffers() override; | ||
|
||
private: | ||
/// Double buffers | ||
std::shared_ptr<MessageCacheCircularBuffer> primary_buffer_; | ||
std::shared_ptr<MessageCacheCircularBuffer> secondary_buffer_; | ||
|
||
/// Double buffers sync | ||
std::mutex cache_mutex_; | ||
}; | ||
|
||
} // namespace cache | ||
} // namespace rosbag2_cpp | ||
|
||
#ifdef _WIN32 | ||
# pragma warning(pop) | ||
#endif | ||
|
||
#endif // ROSBAG2_CPP__CACHE__CIRCULAR_MESSAGE_CACHE_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.