SMACC2
Loading...
Searching...
No Matches
smacc2
src
smacc2
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>
25
#include <
smacc2/callback_counter_semaphore.hpp
>
26
#include <thread>
27
28
namespace
smacc2
29
{
30
CallbackCounterSemaphore::CallbackCounterSemaphore
(std::string name,
int
count)
31
: count_(count), name_(name)
32
{
33
}
34
35
bool
CallbackCounterSemaphore::acquire
()
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
59
void
CallbackCounterSemaphore::release
()
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
70
void
CallbackCounterSemaphore::finalize
()
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
91
void
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
callback_counter_semaphore.hpp
smacc2::CallbackCounterSemaphore::name_
std::string name_
Definition
callback_counter_semaphore.hpp:49
smacc2::CallbackCounterSemaphore::cv_
std::condition_variable cv_
Definition
callback_counter_semaphore.hpp:46
smacc2::CallbackCounterSemaphore::release
void release()
Definition
callback_counter_semaphore.cpp:59
smacc2::CallbackCounterSemaphore::addConnection
void addConnection(boost::signals2::connection conn)
Definition
callback_counter_semaphore.cpp:91
smacc2::CallbackCounterSemaphore::mutex_
std::mutex mutex_
Definition
callback_counter_semaphore.hpp:45
smacc2::CallbackCounterSemaphore::acquire
bool acquire()
Definition
callback_counter_semaphore.cpp:35
smacc2::CallbackCounterSemaphore::CallbackCounterSemaphore
CallbackCounterSemaphore(std::string name, int count=0)
Definition
callback_counter_semaphore.cpp:30
smacc2::CallbackCounterSemaphore::finalized
bool finalized
Definition
callback_counter_semaphore.hpp:48
smacc2::CallbackCounterSemaphore::connections_
std::vector< boost::signals2::connection > connections_
Definition
callback_counter_semaphore.hpp:47
smacc2::CallbackCounterSemaphore::count_
int count_
Definition
callback_counter_semaphore.hpp:44
smacc2::CallbackCounterSemaphore::finalize
void finalize()
Definition
callback_counter_semaphore.cpp:70
smacc2
Definition
callback_counter_semaphore.hpp:30
Generated by
1.12.0