YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
MonitorEvent.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#ifndef MONITOREVENT_INC
7#define MONITOREVENT_INC
8
9#include <string>
10#include <mutex>
11#include <yarp/os/Time.h>
12#include <vector>
13
14
15class MonitorBinding;
16
18{
19public:
20 MonitorEvent(const char* _name, MonitorBinding* _owner, double lf=-1.0) :
21 owner(_owner),
22 name(_name ? _name : ""),
23 lifetime(lf), // default: infinite life time
24 create_time(yarp::os::Time::now())
25 {
26 }
27
28 MonitorBinding* owner; // event's owner
29 std::string name; // event's symbolic name
30 double lifetime; // event's life time in second. negative value means infinite life time.
31 double create_time; // event's creation or updating time
32};
33
34
39{
40public:
41 typedef std::vector<MonitorEvent> vector_type;
42 typedef vector_type::iterator iterator;
43 typedef vector_type::const_iterator const_iterator;
44
45 void setEvent(const char* name, MonitorBinding* owner, double lifetime=-1.0)
46 {
47 // if event already exists just update the create_time and lifetime
48 MonitorEventRecord::iterator itr = findEvent(name, owner);
49 if(itr != events.end())
50 {
51 (*itr).create_time = yarp::os::Time::now();
52 (*itr).lifetime = lifetime;
53 return;
54 }
55 events.push_back(MonitorEvent(name, owner, lifetime));
56 }
57
58 void unsetEvent(const char* name, MonitorBinding* owner)
59 {
60 MonitorEventRecord::iterator itr = findEvent(name, owner);
61 if(itr == events.end()) {
62 return;
63 }
64 events.erase(itr);
65 }
66
67 bool hasEvent(const char* name)
68 {
70 for(itr=events.begin(); itr<events.end(); itr++) {
71 if((*itr).name == name)
72 {
73 if((*itr).lifetime < 0.0) {
74 return true;
75 }
76 if((yarp::os::Time::now() - (*itr).create_time) < (*itr).lifetime) {
77 return true;
78 }
79 events.erase(itr); // remove expired event
80 return false;
81 }
82 }
83 return false;
84 }
85
86 void lock()
87 {
88 mutex.lock();
89 }
90
91 void unlock()
92 {
93 mutex.unlock();
94 }
95
97 {
98 static MonitorEventRecord __instance_MonitorEventRecord;
99 return __instance_MonitorEventRecord;
100 }
101
102private:
103 MonitorEventRecord() = default;
104 MonitorEventRecord(MonitorEventRecord const &) = delete;
105 void operator=(MonitorEventRecord const &) = delete;
106
107 MonitorEventRecord::iterator findEvent(const char* name, MonitorBinding* owner)
108 {
110 for(itr=events.begin(); itr<events.end(); itr++) {
111 if (((*itr).name == name) && ((*itr).owner == owner)) {
112 return itr;
113 }
114 }
115 return events.end();
116 }
117
118
119private:
120 vector_type events;
121 std::mutex mutex;
122};
123
124#endif // MONITOREVENT_INC
A singleton class to record the port monitor events.
void setEvent(const char *name, MonitorBinding *owner, double lifetime=-1.0)
std::vector< MonitorEvent > vector_type
vector_type::iterator iterator
void unsetEvent(const char *name, MonitorBinding *owner)
bool hasEvent(const char *name)
static MonitorEventRecord & getInstance()
vector_type::const_iterator const_iterator
MonitorEvent(const char *_name, MonitorBinding *_owner, double lf=-1.0)
double lifetime
MonitorBinding * owner
double create_time
std::string name
double now()
Return the current time in seconds, relative to an arbitrary starting point.
Definition Time.cpp:121
The main, catch-all namespace for YARP.
Definition dirs.h:16