Skip to content

Commit 2da189f

Browse files
authored
Fix EventDispatcher problem (#2257)
1 parent 6e0f211 commit 2da189f

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

example/ssesvr.cc

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@ class EventDispatcher {
1414
public:
1515
EventDispatcher() {}
1616

17-
void wait_event(DataSink *sink) {
17+
bool wait_event(DataSink *sink) {
1818
unique_lock<mutex> lk(m_);
1919
int id = id_;
20-
cv_.wait(lk, [&] { return cid_ == id; });
20+
21+
// Wait with timeout to prevent hanging if client disconnects
22+
if (!cv_.wait_for(lk, std::chrono::seconds(5),
23+
[&] { return cid_ == id; })) {
24+
return false; // Timeout occurred
25+
}
26+
2127
sink->write(message_.data(), message_.size());
28+
return true;
2229
}
2330

2431
void send_event(const string &message) {
@@ -71,17 +78,15 @@ int main(void) {
7178
cout << "connected to event1..." << endl;
7279
res.set_chunked_content_provider("text/event-stream",
7380
[&](size_t /*offset*/, DataSink &sink) {
74-
ed.wait_event(&sink);
75-
return true;
81+
return ed.wait_event(&sink);
7682
});
7783
});
7884

7985
svr.Get("/event2", [&](const Request & /*req*/, Response &res) {
8086
cout << "connected to event2..." << endl;
8187
res.set_chunked_content_provider("text/event-stream",
8288
[&](size_t /*offset*/, DataSink &sink) {
83-
ed.wait_event(&sink);
84-
return true;
89+
return ed.wait_event(&sink);
8590
});
8691
});
8792

test/test.cc

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11043,11 +11043,18 @@ class EventDispatcher {
1104311043
public:
1104411044
EventDispatcher() {}
1104511045

11046-
void wait_event(DataSink *sink) {
11046+
bool wait_event(DataSink *sink) {
1104711047
unique_lock<mutex> lk(m_);
1104811048
int id = id_;
11049-
cv_.wait(lk, [&] { return cid_ == id; });
11049+
11050+
// Wait with timeout to prevent hanging if client disconnects
11051+
if (!cv_.wait_for(lk, std::chrono::seconds(5),
11052+
[&] { return cid_ == id; })) {
11053+
return false; // Timeout occurred
11054+
}
11055+
1105011056
sink->write(message_.data(), message_.size());
11057+
return true;
1105111058
}
1105211059

1105311060
void send_event(const string &message) {
@@ -11072,8 +11079,7 @@ TEST(ClientInThreadTest, Issue2068) {
1107211079
svr.Get("/event1", [&](const Request & /*req*/, Response &res) {
1107311080
res.set_chunked_content_provider("text/event-stream",
1107411081
[&](size_t /*offset*/, DataSink &sink) {
11075-
ed.wait_event(&sink);
11076-
return true;
11082+
return ed.wait_event(&sink);
1107711083
});
1107811084
});
1107911085

@@ -11116,9 +11122,11 @@ TEST(ClientInThreadTest, Issue2068) {
1111611122
std::this_thread::sleep_for(std::chrono::seconds(2));
1111711123
stop = true;
1111811124
client->stop();
11119-
client.reset();
1112011125

1112111126
t.join();
11127+
11128+
// Reset client after thread has finished
11129+
client.reset();
1112211130
}
1112311131
}
1112411132

0 commit comments

Comments
 (0)