zmqpp  4.1.2
C++ bindings for 0mq (libzmq)
loop.hpp
Go to the documentation of this file.
1 /*
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5  *
6  * This file is part of zmqpp.
7  * Copyright (c) 2011-2015 Contributors as noted in the AUTHORS file.
8  */
9 
10 #pragma once
11 
12 #include <tuple>
13 #include <vector>
14 #include <list>
15 #include <chrono>
16 #include <functional>
17 #include <memory>
18 
19 #include "compatibility.hpp"
20 #include "poller.hpp"
21 
22 namespace zmqpp
23 {
24 
25  class socket;
26  typedef socket socket_t;
27 
35  class loop
36  {
37  public:
41  typedef void * timer_id_t;
42  typedef std::function<bool (void) > Callable;
43 
47  loop();
48 
54  virtual ~loop();
55 
63  void add(socket_t& socket, Callable callable, short const event = poller::poll_in);
64 
72  void add(raw_socket_t const descriptor, Callable callable, short const event = poller::poll_in | poller::poll_error);
73 
81  timer_id_t add(std::chrono::milliseconds delay, size_t times, Callable callable);
82 
88  void reset(timer_id_t const timer);
89 
95  void remove(timer_id_t const timer);
96 
102  void remove(socket_t const& socket);
103 
109  void remove(raw_socket_t const descriptor);
110 
114  void start();
115 
116  private:
117  struct timer_t {
118  size_t times;
119  std::chrono::milliseconds delay;
120  std::chrono::steady_clock::time_point when;
121 
122  timer_t(size_t times, std::chrono::milliseconds delay);
123 
124  void reset();
125  void update();
126  };
127 
128  typedef std::pair<zmq_pollitem_t, Callable> PollItemCallablePair;
129  typedef std::pair<std::unique_ptr<timer_t>, Callable> TimerItemCallablePair;
130  static bool TimerItemCallablePairComp(const TimerItemCallablePair &lhs, const TimerItemCallablePair &rhs);
131 
132  std::vector<PollItemCallablePair> items_;
133  std::list<TimerItemCallablePair> timers_;
134  std::vector<const socket_t *> sockRemoveLater_;
135  std::vector<raw_socket_t> fdRemoveLater_;
136  std::vector<timer_id_t> timerRemoveLater_;
137 
138 
139  void add(const zmq_pollitem_t &item, Callable callable);
140  void add(std::unique_ptr<timer_t>, Callable callable);
141 
142  bool start_handle_timers();
143  bool start_handle_poller();
144 
149  void flush_remove_later();
150 
154  long tickless();
155 
159  };
160 
161 }
zmqpp::loop::items_
std::vector< PollItemCallablePair > items_
Definition: loop.hpp:132
zmqpp
C++ wrapper around zmq.
Definition: actor.cpp:30
zmqpp::loop::TimerItemCallablePairComp
static bool TimerItemCallablePairComp(const TimerItemCallablePair &lhs, const TimerItemCallablePair &rhs)
Definition: loop.cpp:231
zmqpp::loop::~loop
virtual ~loop()
Cleanup reactor.
Definition: loop.cpp:29
zmqpp::loop::timers_
std::list< TimerItemCallablePair > timers_
Definition: loop.hpp:133
zmqpp::loop::flush_remove_later
void flush_remove_later()
Flush the fdRemoveLater_ and sockRemoveLater_ vector, effectively removing the item for the reactor a...
Definition: loop.cpp:208
zmqpp::loop::sockRemoveLater_
std::vector< const socket_t * > sockRemoveLater_
Definition: loop.hpp:134
zmqpp::loop::remove
void remove(timer_id_t const timer)
Remove timer event from the loop.
Definition: loop.cpp:93
zmqpp::loop::timer_t::update
void update()
Definition: loop.cpp:45
zmqpp::socket
The socket class represents the zmq sockets.
Definition: socket.hpp:76
zmqpp::socket_t
socket socket_t
socket type
Definition: loop.hpp:25
zmqpp::loop::PollItemCallablePair
std::pair< zmq_pollitem_t, Callable > PollItemCallablePair
Definition: loop.hpp:128
zmqpp::loop::timer_t::reset
void reset()
Definition: loop.cpp:40
zmqpp::loop::add
void add(socket_t &socket, Callable callable, short const event=poller::poll_in)
Add a socket to the loop, providing a handler that will be called when the monitored events occur.
Definition: loop.cpp:50
poller.hpp
compatibility.hpp
zmqpp::loop::start_handle_timers
bool start_handle_timers()
Definition: loop.cpp:173
zmqpp::loop::timerRemoveLater_
std::vector< timer_id_t > timerRemoveLater_
Definition: loop.hpp:136
zmqpp::loop::timer_t::when
std::chrono::steady_clock::time_point when
Definition: loop.hpp:120
zmqpp::loop
Loop object that helps to manage multiple socket by calling a user-defined handler for each socket wh...
Definition: loop.hpp:36
zmqpp::loop::fdRemoveLater_
std::vector< raw_socket_t > fdRemoveLater_
Definition: loop.hpp:135
zmqpp::loop::start
void start()
Starts loop.
Definition: loop.cpp:145
zmqpp::poller::poll_error
@ poll_error
Definition: poller.hpp:47
zmqpp::loop::dispatching_
bool dispatching_
Definition: loop.hpp:157
zmqpp::loop::TimerItemCallablePair
std::pair< std::unique_ptr< timer_t >, Callable > TimerItemCallablePair
Definition: loop.hpp:129
zmqpp::loop::timer_t::delay
std::chrono::milliseconds delay
Definition: loop.hpp:119
zmqpp::loop::tickless
long tickless()
Calculate min time to wait in poller.
Definition: loop.cpp:221
zmqpp::loop::timer_t
Definition: loop.hpp:117
zmqpp::loop::poller_
poller poller_
Definition: loop.hpp:156
zmqpp::loop::rebuild_poller_
bool rebuild_poller_
Definition: loop.hpp:158
zmqpp::loop::timer_id_t
void * timer_id_t
Type used to identify created timers withing loop.
Definition: loop.hpp:41
zmqpp::loop::timer_t::timer_t
timer_t(size_t times, std::chrono::milliseconds delay)
Definition: loop.cpp:33
zmqpp::poller
Polling wrapper.
Definition: poller.hpp:37
zmqpp::loop::loop
loop()
Construct an empty polling model.
Definition: loop.cpp:23
zmqpp::loop::Callable
std::function< bool(void) > Callable
Definition: loop.hpp:42
zmqpp::loop::reset
void reset(timer_id_t const timer)
Reset timer in the loop, it will start counting delay time again.
Definition: loop.cpp:83
zmqpp::loop::start_handle_poller
bool start_handle_poller()
Definition: loop.cpp:195
zmqpp::poller::poll_in
@ poll_in
Definition: poller.hpp:45
zmqpp::loop::timer_t::times
size_t times
Definition: loop.hpp:118
zmqpp::raw_socket_t
int raw_socket_t
Definition: compatibility.hpp:134