Skip to content

Commit 5e1e281

Browse files
Switched to shared_ptr per review comments
1 parent f72d159 commit 5e1e281

File tree

2 files changed

+103
-65
lines changed

2 files changed

+103
-65
lines changed

common/events.cpp

+80-61
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,58 @@
77
* duplicates helps reduce load.
88
*/
99

10-
typedef map <string, EventPublisher *> lst_publishers_t;
11-
lst_publishers_t s_publishers;
10+
lst_publishers_t EventPublisher::s_publishers;
11+
12+
event_handle_t
13+
EventPublisher::get_publisher(const string event_source)
14+
{
15+
event_handle_t ret = NULL;
16+
lst_publishers_t::const_iterator itc = s_publishers.find(event_source);
17+
if (itc != s_publishers.end()) {
18+
// Pre-exists
19+
ret = itc->second;
20+
}
21+
else {
22+
EventPublisher_ptr_t p(n.get()ew EventPublisher());
23+
24+
int rc = p->init(event_source);
25+
26+
if (rc == 0) {
27+
ret = p.get();
28+
s_publishers[event_source] = p;
29+
}
30+
}
31+
return ret;
32+
}
33+
34+
void
35+
EventPublisher::drop_publisher(event_handle_t handle)
36+
{
37+
lst_publishers_t::iterator it;
38+
39+
for(it=s_publishers.begin(); it != s_publishers.end(); ++it) {
40+
if (it->second.get() == handle) {
41+
s_publishers.erase(it);
42+
break;
43+
}
44+
}
45+
}
1246

1347
EventPublisher::EventPublisher() :
1448
m_zmq_ctx(NULL), m_socket(NULL), m_sequence(0)
1549
{
1650
}
1751

52+
static string
53+
get_uuid()
54+
{
55+
uuid_t id;
56+
char uuid_str[UUID_STR_SIZE];
57+
uuid_generate(id);
58+
uuid_unparse(id, uuid_str);
59+
return string(uuid_str);
60+
}
61+
1862
int EventPublisher::init(const string event_source)
1963
{
2064
m_zmq_ctx = zmq_ctx_new();
@@ -43,13 +87,7 @@ int EventPublisher::init(const string event_source)
4387

4488
m_event_source = event_source;
4589

46-
{
47-
uuid_t id;
48-
char uuid_str[UUID_STR_SIZE];
49-
uuid_generate(id);
50-
uuid_unparse(id, uuid_str);
51-
m_runtime_id = string(uuid_str);
52-
}
90+
m_runtime_id = get_uuid();
5391

5492
m_socket = sock;
5593
out:
@@ -144,40 +182,13 @@ EventPublisher::publish(const string tag, const event_params_t *params)
144182
event_handle_t
145183
events_init_publisher(const string event_source)
146184
{
147-
event_handle_t ret = NULL;
148-
lst_publishers_t::const_iterator itc = s_publishers.find(event_source);
149-
if (itc != s_publishers.end()) {
150-
// Pre-exists
151-
ret = itc->second;
152-
}
153-
else {
154-
EventPublisher *p = new EventPublisher();
155-
156-
int rc = p->init(event_source);
157-
158-
if (rc != 0) {
159-
delete p;
160-
}
161-
else {
162-
ret = p;
163-
s_publishers[event_source] = p;
164-
}
165-
}
166-
return ret;
185+
return EventPublisher::get_publisher(event_source);
167186
}
168187

169188
void
170189
events_deinit_publisher(event_handle_t handle)
171190
{
172-
lst_publishers_t::iterator it;
173-
174-
for(it=s_publishers.begin(); it != s_publishers.end(); ++it) {
175-
if (it->second == handle) {
176-
delete it->second;
177-
s_publishers.erase(it);
178-
break;
179-
}
180-
}
191+
EventPublisher::drop_publisher(handle);
181192
}
182193

183194
int
@@ -193,6 +204,34 @@ event_publish(event_handle_t handle, const string tag, const event_params_t *par
193204
}
194205

195206

207+
event_handle_t
208+
EventSubscriber::get_subscriber(bool use_cache, int recv_timeout,
209+
const event_subscribe_sources_t *sources)
210+
{
211+
212+
if (s_subscriber == NULL) {
213+
EventSubscriber_ptr_t sub(new EventSubscriber());
214+
215+
RET_ON_ERR(sub->init(use_cache, recv_timeout, sources) == 0,
216+
"Failed to init subscriber");
217+
218+
s_subscriber = sub;
219+
}
220+
out:
221+
return s_subscriber.get();
222+
}
223+
224+
225+
void
226+
EventSubscriber::drop_subscriber(event_handle_t handle)
227+
{
228+
if ((handle == s_subscriber) && (s_subscriber != NULL)) {
229+
delete s_subscriber;
230+
s_subscriber = NULL;
231+
}
232+
}
233+
234+
196235
EventSubscriber::EventSubscriber() : m_zmq_ctx(NULL), m_socket(NULL),
197236
m_cache_read(false)
198237
{};
@@ -407,41 +446,21 @@ EventSubscriber::event_receive(string &key, event_params_t &params, int &missed_
407446

408447

409448
/* Expect only one subscriber per process */
410-
static EventSubscriber *s_subscriber = NULL;
449+
EventSubscriber *EventSubscriber::s_subscriber = NULL;
411450

412451
event_handle_t
413452
events_init_subscriber(bool use_cache, int recv_timeout,
414453
const event_subscribe_sources_t *sources)
415454
{
416-
EventSubscriber *sub = NULL;
417-
418-
if (s_subscriber == NULL) {
419-
sub = new EventSubscriber();
420-
421-
RET_ON_ERR(sub->init(use_cache, recv_timeout, sources) == 0,
422-
"Failed to init subscriber");
423-
424-
s_subscriber = sub;
425-
sub = NULL;
426-
}
427-
out:
428-
if (sub != NULL) {
429-
delete sub;
430-
}
431-
return s_subscriber;
455+
return EventSubscriber::get_subscriber(use_cache, recv_timeout, sources);
432456
}
433457

434-
435458
void
436459
events_deinit_subscriber(event_handle_t handle)
437460
{
438-
if ((handle == s_subscriber) && (s_subscriber != NULL)) {
439-
delete s_subscriber;
440-
s_subscriber = NULL;
441-
}
461+
EventSubscriber::drop_subscriber(handle);
442462
}
443463

444-
445464
event_receive_op_t
446465
event_receive(event_handle_t handle)
447466
{

common/events_pi.h

+23-4
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,29 @@ class events_base
3535
* There can be multiple sender processes/threads for a single source.
3636
*
3737
*/
38+
class EventPublisher;
39+
typedef shared_ptr<EventPublisher> EventPublisher_ptr_t;
40+
typedef map <string, EventPublisher_ptr_t> lst_publishers_t;
41+
3842

3943
class EventPublisher : public events_base
4044
{
41-
public:
42-
EventPublisher();
45+
static lst_publishers_t s_publishers;
4346

47+
public:
4448
virtual ~EventPublisher();
4549

4650
int init(const string event_source);
4751

4852
int publish(const string event_tag,
4953
const event_params_t *params);
54+
55+
static event_handle_t get_publisher(const string event_source);
56+
static void drop_publisher((event_handle_t handle);
57+
5058
private:
59+
EventPublisher();
60+
5161

5262
void *m_zmq_ctx;
5363
void *m_socket;
@@ -72,12 +82,14 @@ class EventPublisher : public events_base
7282
* would have nearly no impact on others.
7383
*
7484
*/
85+
class EventSubscriber;
86+
typedef shared_ptr<EventSubscriber> EventSubscriber_ptr_t;
7587

7688
class EventSubscriber : public events_base
7789
{
90+
static EventSubscriber_ptr_t s_subscriber;
91+
7892
public:
79-
EventSubscriber();
80-
8193
int init(bool use_cache=false,
8294
int recv_timeout= -1,
8395
const event_subscribe_sources_t *subs_sources=NULL);
@@ -86,7 +98,14 @@ class EventSubscriber : public events_base
8698

8799
int event_receive(string &key, event_params_t &params, int &missed_cnt);
88100

101+
static event_handle_t get_subscriber(bool use_cache, int recv_timeout,
102+
const event_subscribe_sources_t *sources);
103+
104+
static void drop_subscriber(event_handle_t handle);
105+
89106
private:
107+
EventSubscriber();
108+
90109
void *m_zmq_ctx;
91110
void *m_socket;
92111

0 commit comments

Comments
 (0)