Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
poller.h
Go to the documentation of this file.
1// Copyright 2017-2021:
2// GobySoft, LLC (2013-)
3// Community contributors (see AUTHORS file)
4// File authors:
5// Toby Schneider <toby@gobysoft.org>
6// Ryan Govostes <rgovostes+git@gmail.com>
7//
8//
9// This file is part of the Goby Underwater Autonomy Project Libraries
10// ("The Goby Libraries").
11//
12// The Goby Libraries are free software: you can redistribute them and/or modify
13// them under the terms of the GNU Lesser General Public License as published by
14// the Free Software Foundation, either version 2.1 of the License, or
15// (at your option) any later version.
16//
17// The Goby Libraries are distributed in the hope that they will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20// GNU Lesser General Public License for more details.
21//
22// You should have received a copy of the GNU Lesser General Public License
23// along with Goby. If not, see <http://www.gnu.org/licenses/>.
24
25#ifndef GOBY_MIDDLEWARE_TRANSPORT_POLLER_H
26#define GOBY_MIDDLEWARE_TRANSPORT_POLLER_H
27
28#include "interface.h"
29
30namespace goby
31{
32namespace middleware
33{
37template <typename Transporter> class Poller : public PollerInterface
38{
39 protected:
42 : // we want the same mutex and cv all the way up
44 inner_poller ? inner_poller->poll_mutex() : std::make_shared<std::timed_mutex>(),
45 inner_poller ? inner_poller->cv() : std::make_shared<std::condition_variable_any>()),
46 inner_poller_(inner_poller)
47 {
48 }
49
51 PollerInterface* inner_poller() { return inner_poller_; }
52
53 private:
54 int _transporter_poll(std::unique_ptr<std::unique_lock<std::timed_mutex> >& lock) override
55 {
56 // work from the inside out
57 int inner_poll_items = 0;
58 if (inner_poller_) // recursively call inner poll
59 inner_poll_items +=
60 static_cast<PollerInterface*>(inner_poller_)->_transporter_poll(lock);
61
62 int poll_items = 0;
63 if (!inner_poll_items)
64 poll_items += static_cast<Transporter*>(this)->_poll(lock);
65
66 // goby::glog.is(goby::util::logger::DEBUG3) && goby::glog << "Poller::transporter_poll(): " << typeid(*this).name() << " this: " << this << " (" << poll_items << " items) "<< " inner_poller_: " << inner_poller_ << " (" << inner_poll_items << " items) " << std::endl;
67
68 return inner_poll_items + poll_items;
69 }
70
71 private:
72 PollerInterface* inner_poller_;
73};
74} // namespace goby
75} // namespace goby
76
77#endif
Defines the common interface for polling for data on Goby transporters.
Definition interface.h:140
std::shared_ptr< std::condition_variable_any > cv()
access the condition variable used for poll synchronization
Definition interface.h:166
std::shared_ptr< std::timed_mutex > poll_mutex()
access the mutex used for poll synchronization
Definition interface.h:160
Utility class for allowing the various Goby middleware transporters to poll the underlying transport ...
Definition poller.h:38
Poller(PollerInterface *inner_poller=nullptr)
Construct this Poller with a pointer to the inner Poller (unless this is the innermost Poller)
Definition poller.h:41
PollerInterface * inner_poller()
Definition poller.h:51
The global namespace for the Goby project.
STL namespace.