浏览代码

LibCore: Don't fire Socket::on_ready_to_read if !can_read()

This is a bit of a pickle and I'm unsure what's the best behavior here.

Since notifiers fire asynchronously via the event loop, we may end up
firing a notifier for a socket fd, but then reading/writing that socket
fd before ending up in the notifier callback.

In that situation, the socket is no longer in the same state as it was
when the event loop generated the notifier event.

This patch stops Socket from firing one hook in this situation but this
probably needs a global rethink.

With this change, Browser starts reliably in multi-process mode. :^)
Andreas Kling 5 年之前
父节点
当前提交
41066b009f
共有 1 个文件被更改,包括 2 次插入0 次删除
  1. 2 0
      Libraries/LibCore/Socket.cpp

+ 2 - 0
Libraries/LibCore/Socket.cpp

@@ -204,6 +204,8 @@ void Socket::ensure_read_notifier()
     ASSERT(m_connected);
     ASSERT(m_connected);
     m_read_notifier = Notifier::construct(fd(), Notifier::Event::Read, this);
     m_read_notifier = Notifier::construct(fd(), Notifier::Event::Read, this);
     m_read_notifier->on_ready_to_read = [this] {
     m_read_notifier->on_ready_to_read = [this] {
+        if (!can_read())
+            return;
         if (on_ready_to_read)
         if (on_ready_to_read)
             on_ready_to_read();
             on_ready_to_read();
     };
     };