pal_statistics.h
Go to the documentation of this file.
1 
26 #ifndef _PAL_STATISTICS_H_
27 #define _PAL_STATISTICS_H_
28 
29 #include <ros/ros.h>
30 #include <boost/thread/lock_guard.hpp>
31 #include <boost/thread/mutex.hpp>
32 #include <boost/thread/condition_variable.hpp>
33 #include <boost/thread/thread.hpp>
34 #include <pal_statistics_msgs/Statistics.h>
36 #include <gtest/gtest_prod.h>
37 
38 namespace pal_statistics
39 {
53 class StatisticsRegistry : public boost::enable_shared_from_this<StatisticsRegistry>
54 {
55 public:
56  StatisticsRegistry(const std::string &topic);
57 
58  virtual ~StatisticsRegistry();
59 
64  IdType registerVariable(const std::string &name, const double * variable, RegistrationsRAII *bookkeeping = NULL,
65  bool enabled = true)
66  {
67  return registerInternal(name, VariableHolder(variable), bookkeeping, enabled);
68  }
69 
74  IdType registerFunction(const std::string &name, const boost::function<double()> &funct,
75  RegistrationsRAII *bookkeeping = NULL, bool enabled = true);
76 
77 
78  void unregisterVariable(const std::string &name, RegistrationsRAII *bookkeeping = NULL);
79  void unregisterVariable(IdType id, RegistrationsRAII *bookkeeping = NULL);
80 
87  void publish();
88 
96  bool publishAsync();
97 
102  void startPublishThread();
103 
109  pal_statistics_msgs::Statistics createMsg();
110 
114  template <typename T>
115  void publishCustomStatistic(const std::string &name, T value)
116  {
117  pal_statistics_msgs::Statistics msg;
118  pal_statistics_msgs::Statistic stat;
119  stat.name = name;
120  stat.value = static_cast<double>(value);
121  msg.statistics.push_back(stat);
122  msg.header.stamp = ros::Time::now();
123  pub_.publish(msg);
124  }
125 
129  void publishCustomStatistics(const pal_statistics_msgs::Statistics &msg)
130  {
131  pub_.publish(msg);
132  }
133 
147  bool enable(const IdType &id);
148  bool disable(const IdType &id);
149 
150 private:
156  void updateMsgUnsafe();
157 
162  bool updateMsg(pal_statistics_msgs::StatisticsNames &names,
163  pal_statistics_msgs::StatisticsValues &values, bool smart_fill = false);
164 
165  void publisherThreadCycle();
166 
167  void startPublishThreadImpl();
168 
169  IdType registerInternal(const std::string &name, VariableHolder &&variable, RegistrationsRAII *bookkeeping, bool enabled);
170 
171  bool setEnabledmpl(const IdType &id, bool enabled);
172 
176  void handlePendingDisables(const boost::unique_lock<boost::mutex> &data_lock);
177 
181  void doPublish(bool publish_names_msg = true);
182 
184 
185  boost::mutex data_mutex_;
187 
188  struct EnabledId
189  {
190  //Can't use a pair because it's not trivially copiable
192  bool enabled;
193  };
194 
206 
207 
208  // To avoid deadlocks, should always be acquired after data_mutex_
209  boost::mutex pub_mutex_;
213 
214  std::atomic<bool> is_data_ready_;
215  std::atomic<bool> interrupt_thread_;
217 
219  {
221  : last_names_version_(-1)
222  {}
223  void update(const pal_statistics_msgs::StatisticsNames &names,
224  const pal_statistics_msgs::StatisticsValues &values);
225 
227  pal_statistics_msgs::Statistics msg_;
228  unsigned int last_names_version_;
229  };
230 
231  pal_statistics_msgs::StatisticsNames names_msg_;
232  pal_statistics_msgs::StatisticsValues values_msg_;
234  // Internal stats
239 
240  FRIEND_TEST(PalStatisticsTest, stressAsync);
241 };
242 } // namespace pal_statistics
243 #endif
pal_statistics::StatisticsRegistry::internal_stats_raii_
RegistrationsRAII internal_stats_raii_
Definition: pal_statistics.h:238
pal_statistics::StatisticsRegistry::enable
bool enable(const IdType &id)
Definition: pal_statistics.cpp:197
pal_statistics::StatisticsRegistry::startPublishThreadImpl
void startPublishThreadImpl()
Definition: pal_statistics.cpp:120
pal_statistics::StatisticsRegistry::EnabledId::id
IdType id
Definition: pal_statistics.h:191
pal_statistics::StatisticsRegistry::publish
void publish()
publish Reads the values of all registered variables and publishes them to the topic associated to th...
Definition: pal_statistics.cpp:74
ros::Publisher
pal_statistics::StatisticsRegistry::disable
bool disable(const IdType &id)
Definition: pal_statistics.cpp:202
pal_statistics::StatisticsRegistry::EnabledId::enabled
bool enabled
Definition: pal_statistics.h:192
boost::shared_ptr< boost::thread >
pal_statistics::StatisticsRegistry::publishAsync
bool publishAsync()
publishAsync Capture data and flag it to be published by the publisher thread. Real-Time safe.
Definition: pal_statistics.cpp:86
pal_statistics::StatisticsRegistry::doPublish
void doPublish(bool publish_names_msg=true)
doPublish publishes the subscribed topics, requires mutex
Definition: pal_statistics.cpp:163
pal_statistics::StatisticsRegistry::StatisticsRegistry
StatisticsRegistry(const std::string &topic)
Definition: pal_statistics.cpp:14
pal_statistics::StatisticsRegistry::pub_mutex_
boost::mutex pub_mutex_
Definition: pal_statistics.h:209
ros.h
pal_statistics::StatisticsRegistry::setEnabledmpl
bool setEnabledmpl(const IdType &id, bool enabled)
Definition: pal_statistics.cpp:140
pal_statistics::PalStatisticsTest
Definition: gtest_pal_statistics.cpp:21
pal_statistics::StatisticsRegistry::FRIEND_TEST
FRIEND_TEST(PalStatisticsTest, stressAsync)
pal_statistics::StatisticsRegistry::startPublishThread
void startPublishThread()
startPublishThread creates and starts the publisherThread. The user still has to call publishAsync ea...
Definition: pal_statistics.cpp:115
pal_statistics::StatisticsRegistry
The StatisticsRegistry class reads the value of registered variables and publishes them on the specif...
Definition: pal_statistics.h:53
pal_statistics::StatisticsRegistry::publish_async_failures_
unsigned int publish_async_failures_
Definition: pal_statistics.h:236
pal_statistics::StatisticsRegistry::unregisterVariable
void unregisterVariable(const std::string &name, RegistrationsRAII *bookkeeping=NULL)
Definition: pal_statistics.cpp:62
pal_statistics::LockFreeQueue
Simple wrapper around boost lockfree queue to keep track of the reserved memory Boost's implementatio...
Definition: pal_statistics_utils.h:54
pal_statistics::StatisticsRegistry::GeneratedStatistics::msg_
pal_statistics_msgs::Statistics msg_
This message is generated using an updated StatiticsNames and StatisticsValues.
Definition: pal_statistics.h:227
pal_statistics::StatisticsRegistry::pub_values_
ros::Publisher pub_values_
Definition: pal_statistics.h:212
pal_statistics::StatisticsRegistry::last_async_pub_duration_
double last_async_pub_duration_
Definition: pal_statistics.h:237
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
pal_statistics::StatisticsRegistry::GeneratedStatistics
Definition: pal_statistics.h:218
pal_statistics::RegistrationList
The RegistrationList class.
Definition: pal_statistics_utils.h:202
pal_statistics::StatisticsRegistry::generated_statistics_
GeneratedStatistics generated_statistics_
Definition: pal_statistics.h:233
pal_statistics::StatisticsRegistry::publishCustomStatistic
void publishCustomStatistic(const std::string &name, T value)
publishCustomStatistic publishes a one-time statistic
Definition: pal_statistics.h:115
pal_statistics::StatisticsRegistry::nh_
ros::NodeHandle nh_
Definition: pal_statistics.h:183
pal_statistics::StatisticsRegistry::createMsg
pal_statistics_msgs::Statistics createMsg()
createMsg creates a Statistics message from the registered variables, useful for debugging
Definition: pal_statistics.cpp:183
pal_statistics
Definition: extract_rosbag_signals.h:14
pal_statistics::StatisticsRegistry::is_data_ready_
std::atomic< bool > is_data_ready_
Definition: pal_statistics.h:214
pal_statistics::StatisticsRegistry::names_msg_
pal_statistics_msgs::StatisticsNames names_msg_
Definition: pal_statistics.h:231
pal_statistics::StatisticsRegistry::GeneratedStatistics::last_names_version_
unsigned int last_names_version_
Definition: pal_statistics.h:228
pal_statistics::StatisticsRegistry::~StatisticsRegistry
virtual ~StatisticsRegistry()
Definition: pal_statistics.cpp:31
pal_statistics::StatisticsRegistry::updateMsg
bool updateMsg(pal_statistics_msgs::StatisticsNames &names, pal_statistics_msgs::StatisticsValues &values, bool smart_fill=false)
updateMsg update names and values, optionally using smartfill to minimize copying
Definition: pal_statistics.cpp:207
pal_statistics::StatisticsRegistry::publisherThreadCycle
void publisherThreadCycle()
Definition: pal_statistics.cpp:220
pal_statistics::StatisticsRegistry::GeneratedStatistics::update
void update(const pal_statistics_msgs::StatisticsNames &names, const pal_statistics_msgs::StatisticsValues &values)
Definition: pal_statistics.cpp:248
pal_statistics::StatisticsRegistry::values_msg_
pal_statistics_msgs::StatisticsValues values_msg_
Definition: pal_statistics.h:232
pal_statistics::StatisticsRegistry::registerVariable
IdType registerVariable(const std::string &name, const double *variable, RegistrationsRAII *bookkeeping=NULL, bool enabled=true)
registerVariable Specialization for double*, the most common case, to avoid going through a boost fun...
Definition: pal_statistics.h:64
pal_statistics::StatisticsRegistry::publishCustomStatistics
void publishCustomStatistics(const pal_statistics_msgs::Statistics &msg)
publishCustomStatistic publishes a one-time statistics msg
Definition: pal_statistics.h:129
pal_statistics::StatisticsRegistry::EnabledId
Definition: pal_statistics.h:188
pal_statistics::StatisticsRegistry::handlePendingDisables
void handlePendingDisables(const boost::unique_lock< boost::mutex > &data_lock)
handlePendingDisables Empties by handling the queue of disabled/enabled ids.
Definition: pal_statistics.cpp:149
pal_statistics::StatisticsRegistry::registerFunction
IdType registerFunction(const std::string &name, const boost::function< double()> &funct, RegistrationsRAII *bookkeeping=NULL, bool enabled=true)
registerFunction Adds a function that returns double with the specified name
Definition: pal_statistics.cpp:44
pal_statistics::StatisticsRegistry::pub_names_
ros::Publisher pub_names_
Definition: pal_statistics.h:211
pal_statistics::StatisticsRegistry::publish_async_attempts_
unsigned int publish_async_attempts_
Definition: pal_statistics.h:235
pal_statistics::StatisticsRegistry::enabled_ids_
LockFreeQueue< EnabledId > enabled_ids_
disabled_ids_ this is used to keep track of enabled/disabled variables in a lock free way
Definition: pal_statistics.h:205
pal_statistics::StatisticsRegistry::interrupt_thread_
std::atomic< bool > interrupt_thread_
Definition: pal_statistics.h:215
pal_statistics::StatisticsRegistry::publisher_thread_
boost::shared_ptr< boost::thread > publisher_thread_
Definition: pal_statistics.h:216
pal_statistics_utils.h
pal_statistics::StatisticsRegistry::GeneratedStatistics::GeneratedStatistics
GeneratedStatistics()
Definition: pal_statistics.h:220
pal_statistics::StatisticsRegistry::pub_
ros::Publisher pub_
Definition: pal_statistics.h:210
pal_statistics::StatisticsRegistry::registerInternal
IdType registerInternal(const std::string &name, VariableHolder &&variable, RegistrationsRAII *bookkeeping, bool enabled)
Definition: pal_statistics.cpp:125
pal_statistics::StatisticsRegistry::updateMsgUnsafe
void updateMsgUnsafe()
updateMsgUnsafe Updates the internal message variable without acquiring the mutex Should only be used...
pal_statistics::VariableHolder
Definition: pal_statistics_utils.h:147
pal_statistics::RegistrationsRAII
The RegistrationsRAII class holds handles to registered variables and when it is destroyed,...
Definition: pal_statistics_utils.h:117
ros::NodeHandle
pal_statistics::StatisticsRegistry::registration_list_
RegistrationList registration_list_
Definition: pal_statistics.h:186
ros::Time::now
static Time now()
pal_statistics::IdType
unsigned int IdType
Definition: pal_statistics_utils.h:46
pal_statistics::StatisticsRegistry::data_mutex_
boost::mutex data_mutex_
Definition: pal_statistics.h:185


pal_statistics
Author(s):
autogenerated on Fri Aug 2 2024 08:29:35