00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROSCPP_SUBSCRIPTION_QUEUE_H
00029 #define ROSCPP_SUBSCRIPTION_QUEUE_H
00030
00031 #include "forwards.h"
00032 #include "common.h"
00033 #include "message_event.h"
00034 #include "callback_queue_interface.h"
00035
00036 #include <boost/thread/recursive_mutex.hpp>
00037 #include <boost/thread/mutex.hpp>
00038 #include <boost/enable_shared_from_this.hpp>
00039 #include <deque>
00040
00041 namespace ros
00042 {
00043
00044 class MessageDeserializer;
00045 typedef boost::shared_ptr<MessageDeserializer> MessageDeserializerPtr;
00046
00047 class SubscriptionCallbackHelper;
00048 typedef boost::shared_ptr<SubscriptionCallbackHelper> SubscriptionCallbackHelperPtr;
00049
00050 class ROSCPP_DECL SubscriptionQueue : public CallbackInterface, public boost::enable_shared_from_this<SubscriptionQueue>
00051 {
00052 private:
00053 struct Item
00054 {
00055 SubscriptionCallbackHelperPtr helper;
00056 MessageDeserializerPtr deserializer;
00057
00058 bool has_tracked_object;
00059 VoidConstWPtr tracked_object;
00060
00061 bool nonconst_need_copy;
00062 ros::Time receipt_time;
00063 };
00064 typedef std::deque<Item> D_Item;
00065
00066 public:
00067 SubscriptionQueue(const std::string& topic, int32_t queue_size, bool allow_concurrent_callbacks);
00068 ~SubscriptionQueue();
00069
00070 void push(const SubscriptionCallbackHelperPtr& helper, const MessageDeserializerPtr& deserializer,
00071 bool has_tracked_object, const VoidConstWPtr& tracked_object, bool nonconst_need_copy,
00072 ros::Time receipt_time = ros::Time(), bool* was_full = 0);
00073 void clear();
00074
00075 virtual CallbackInterface::CallResult call();
00076 virtual bool ready();
00077 bool full();
00078
00079 private:
00080 bool fullNoLock();
00081 std::string topic_;
00082 int32_t size_;
00083 bool full_;
00084
00085 boost::mutex queue_mutex_;
00086 D_Item queue_;
00087 uint32_t queue_size_;
00088 bool allow_concurrent_callbacks_;
00089
00090 boost::recursive_mutex callback_mutex_;
00091 };
00092
00093 }
00094
00095 #endif // ROSCPP_SUBSCRIPTION_QUEUE_H