SMACC2
Loading...
Searching...
No Matches
callback_counter_semaphore.cpp
Go to the documentation of this file.
1// Copyright 2021 RobosoftAI Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*****************************************************************************************************************
16 *
17 * Authors: Pablo Inigo Blasco, Brett Aldrich
18 *
19 *****************************************************************************************************************/
20#include <boost/signals2.hpp>
21#include <condition_variable>
22#include <iostream>
23#include <mutex>
24#include <rclcpp/rclcpp.hpp>
26#include <thread>
27
28namespace smacc2
29{
31: count_(count), name_(name)
32{
33}
34
36{
37 std::unique_lock<std::mutex> lock(mutex_);
38 RCLCPP_DEBUG(
39 rclcpp::get_logger(name_), "[CallbackCounterSemaphore] acquire callback %s %ld", name_.c_str(),
40 (long)this);
41
42 if (finalized)
43 {
44 RCLCPP_DEBUG(
45 rclcpp::get_logger(name_), "[CallbackCounterSemaphore] callback rejected %s %ld",
46 name_.c_str(), (long)this);
47 return false;
48 }
49
50 ++count_;
51 cv_.notify_one();
52
53 RCLCPP_DEBUG(
54 rclcpp::get_logger(name_), "[CallbackCounterSemaphore] callback accepted %s %ld", name_.c_str(),
55 (long)this);
56 return true;
57}
58
60{
61 std::unique_lock<std::mutex> lock(mutex_);
62 --count_;
63 cv_.notify_one();
64
65 RCLCPP_DEBUG(
66 rclcpp::get_logger(name_), "[CallbackCounterSemaphore] callback finished %s %ld", name_.c_str(),
67 (long)this);
68}
69
71{
72 std::unique_lock<std::mutex> lock(mutex_);
73
74 while (count_ > 0)
75 {
76 cv_.wait(lock);
77 }
78 finalized = true;
79
80 for (auto conn : connections_)
81 {
82 conn.disconnect();
83 }
84
85 connections_.clear();
86 RCLCPP_DEBUG(
87 rclcpp::get_logger(name_), "[CallbackCounterSemaphore] callbacks finalized %s %ld",
88 name_.c_str(), (long)this);
89}
90
91void CallbackCounterSemaphore::addConnection(boost::signals2::connection conn)
92{
93 std::unique_lock<std::mutex> lock(mutex_);
94
95 if (finalized)
96 {
97 RCLCPP_DEBUG(
98 rclcpp::get_logger(name_),
99 "[CallbackCounterSemaphore] ignoring adding callback, already finalized %s %ld",
100 name_.c_str(), (long)this);
101 return;
102 }
103
104 connections_.push_back(conn);
105}
106
107} // namespace smacc2
void addConnection(boost::signals2::connection conn)
CallbackCounterSemaphore(std::string name, int count=0)
std::vector< boost::signals2::connection > connections_