You've already forked cpp-httplib
Fix EventDispatcher problem (#2257)
This commit is contained in:
@@ -14,11 +14,18 @@ class EventDispatcher {
|
|||||||
public:
|
public:
|
||||||
EventDispatcher() {}
|
EventDispatcher() {}
|
||||||
|
|
||||||
void wait_event(DataSink *sink) {
|
bool wait_event(DataSink *sink) {
|
||||||
unique_lock<mutex> lk(m_);
|
unique_lock<mutex> lk(m_);
|
||||||
int id = id_;
|
int id = id_;
|
||||||
cv_.wait(lk, [&] { return cid_ == id; });
|
|
||||||
|
// Wait with timeout to prevent hanging if client disconnects
|
||||||
|
if (!cv_.wait_for(lk, std::chrono::seconds(5),
|
||||||
|
[&] { return cid_ == id; })) {
|
||||||
|
return false; // Timeout occurred
|
||||||
|
}
|
||||||
|
|
||||||
sink->write(message_.data(), message_.size());
|
sink->write(message_.data(), message_.size());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_event(const string &message) {
|
void send_event(const string &message) {
|
||||||
@@ -71,8 +78,7 @@ int main(void) {
|
|||||||
cout << "connected to event1..." << endl;
|
cout << "connected to event1..." << endl;
|
||||||
res.set_chunked_content_provider("text/event-stream",
|
res.set_chunked_content_provider("text/event-stream",
|
||||||
[&](size_t /*offset*/, DataSink &sink) {
|
[&](size_t /*offset*/, DataSink &sink) {
|
||||||
ed.wait_event(&sink);
|
return ed.wait_event(&sink);
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -80,8 +86,7 @@ int main(void) {
|
|||||||
cout << "connected to event2..." << endl;
|
cout << "connected to event2..." << endl;
|
||||||
res.set_chunked_content_provider("text/event-stream",
|
res.set_chunked_content_provider("text/event-stream",
|
||||||
[&](size_t /*offset*/, DataSink &sink) {
|
[&](size_t /*offset*/, DataSink &sink) {
|
||||||
ed.wait_event(&sink);
|
return ed.wait_event(&sink);
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
18
test/test.cc
18
test/test.cc
@@ -11043,11 +11043,18 @@ class EventDispatcher {
|
|||||||
public:
|
public:
|
||||||
EventDispatcher() {}
|
EventDispatcher() {}
|
||||||
|
|
||||||
void wait_event(DataSink *sink) {
|
bool wait_event(DataSink *sink) {
|
||||||
unique_lock<mutex> lk(m_);
|
unique_lock<mutex> lk(m_);
|
||||||
int id = id_;
|
int id = id_;
|
||||||
cv_.wait(lk, [&] { return cid_ == id; });
|
|
||||||
|
// Wait with timeout to prevent hanging if client disconnects
|
||||||
|
if (!cv_.wait_for(lk, std::chrono::seconds(5),
|
||||||
|
[&] { return cid_ == id; })) {
|
||||||
|
return false; // Timeout occurred
|
||||||
|
}
|
||||||
|
|
||||||
sink->write(message_.data(), message_.size());
|
sink->write(message_.data(), message_.size());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_event(const string &message) {
|
void send_event(const string &message) {
|
||||||
@@ -11072,8 +11079,7 @@ TEST(ClientInThreadTest, Issue2068) {
|
|||||||
svr.Get("/event1", [&](const Request & /*req*/, Response &res) {
|
svr.Get("/event1", [&](const Request & /*req*/, Response &res) {
|
||||||
res.set_chunked_content_provider("text/event-stream",
|
res.set_chunked_content_provider("text/event-stream",
|
||||||
[&](size_t /*offset*/, DataSink &sink) {
|
[&](size_t /*offset*/, DataSink &sink) {
|
||||||
ed.wait_event(&sink);
|
return ed.wait_event(&sink);
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -11116,9 +11122,11 @@ TEST(ClientInThreadTest, Issue2068) {
|
|||||||
std::this_thread::sleep_for(std::chrono::seconds(2));
|
std::this_thread::sleep_for(std::chrono::seconds(2));
|
||||||
stop = true;
|
stop = true;
|
||||||
client->stop();
|
client->stop();
|
||||||
client.reset();
|
|
||||||
|
|
||||||
t.join();
|
t.join();
|
||||||
|
|
||||||
|
// Reset client after thread has finished
|
||||||
|
client.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user