Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / net / socket / stream_listen_socket.cc
index d17ce75..abb5fbc 100644 (file)
@@ -21,6 +21,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/posix/eintr_wrapper.h"
+#include "base/profiler/scoped_tracker.h"
 #include "base/sys_byteorder.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
@@ -246,18 +247,24 @@ void StreamListenSocket::UnwatchSocket() {
 #if defined(OS_WIN)
 // MessageLoop watcher callback.
 void StreamListenSocket::OnObjectSignaled(HANDLE object) {
+  // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
+  tracked_objects::ScopedTracker tracking_profile(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION("StreamListenSocket_OnObjectSignaled"));
+
   WSANETWORKEVENTS ev;
   if (kSocketError == WSAEnumNetworkEvents(socket_, socket_event_, &ev)) {
     // TODO
     return;
   }
 
-  if (ev.lNetworkEvents & FD_CLOSE) {
+  // If both FD_CLOSE and FD_READ are set we only call Read().
+  // This will cause OnObjectSignaled to be called immediately again
+  // unless this socket is destroyed in Read().
+  if ((ev.lNetworkEvents & (FD_CLOSE | FD_READ)) == FD_CLOSE) {
     Close();
     // Close might have deleted this object. We should return immediately.
     return;
   }
-
   // The object was reset by WSAEnumNetworkEvents.  Watch for the next signal.
   watcher_.StartWatching(object, this);
 
@@ -274,8 +281,7 @@ void StreamListenSocket::OnObjectSignaled(HANDLE object) {
       has_pending_reads_ = true;
     } else {
       Read();
-      // Read() might call Close() internally and 'this' can be invalid here
-      return;
+      // Read might have deleted this object. We should return immediately.
     }
   }
 }