event/MultiSocketMonitor: eliminate virtual method CheckSockets()
Handle timeout internally.
This commit is contained in:
@@ -42,7 +42,8 @@ static GSourceFuncs multi_socket_monitor_source_funcs = {
|
||||
MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop)
|
||||
:loop(_loop),
|
||||
source((Source *)g_source_new(&multi_socket_monitor_source_funcs,
|
||||
sizeof(*source))) {
|
||||
sizeof(*source))),
|
||||
absolute_timeout_us(G_MAXINT64) {
|
||||
source->monitor = this;
|
||||
|
||||
g_source_attach(&source->base, loop.GetContext());
|
||||
@@ -55,10 +56,21 @@ MultiSocketMonitor::~MultiSocketMonitor()
|
||||
source = nullptr;
|
||||
}
|
||||
|
||||
bool
|
||||
MultiSocketMonitor::Prepare(gint *timeout_r)
|
||||
{
|
||||
int timeout_ms = *timeout_r = PrepareSockets();
|
||||
absolute_timeout_us = timeout_ms < 0
|
||||
? G_MAXINT64
|
||||
: GetTime() + gint64(timeout_ms) * 1000;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
MultiSocketMonitor::Check() const
|
||||
{
|
||||
if (CheckSockets())
|
||||
if (GetTime() >= absolute_timeout_us)
|
||||
return true;
|
||||
|
||||
for (const auto &i : fds)
|
||||
|
@@ -52,6 +52,7 @@ class MultiSocketMonitor {
|
||||
|
||||
EventLoop &loop;
|
||||
Source *source;
|
||||
gint64 absolute_timeout_us;
|
||||
std::forward_list<GPollFD> fds;
|
||||
|
||||
public:
|
||||
@@ -105,7 +106,6 @@ protected:
|
||||
* @return timeout [ms] or -1 for no timeout
|
||||
*/
|
||||
virtual int PrepareSockets() = 0;
|
||||
virtual bool CheckSockets() const { return false; }
|
||||
virtual void DispatchSockets() = 0;
|
||||
|
||||
public:
|
||||
@@ -116,11 +116,7 @@ public:
|
||||
gpointer user_data);
|
||||
|
||||
private:
|
||||
bool Prepare(gint *timeout_r) {
|
||||
*timeout_r = PrepareSockets();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Prepare(gint *timeout_r);
|
||||
bool Check() const;
|
||||
|
||||
void Dispatch() {
|
||||
|
Reference in New Issue
Block a user