APIs to determine which end of the socket has closed it
[folly.git] / folly / io / async / AsyncSocket.h
index 17e87796f0cbefaa7e79a3ae2dc7022424821827..4fd5b625abaae7e28136e79d638ef57c4f534a5b 100644 (file)
@@ -369,6 +369,16 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
     return (state_ == StateEnum::CONNECTING);
   }
 
+  virtual bool isClosedByPeer() const {
+    return (state_ == StateEnum::CLOSED &&
+            (readErr_ == READ_EOF || readErr_ == READ_ERROR));
+  }
+
+  virtual bool isClosedBySelf() const {
+    return (state_ == StateEnum::CLOSED &&
+            (readErr_ != READ_EOF && readErr_ != READ_ERROR));
+  }
+
   size_t getAppBytesWritten() const override {
     return appBytesWritten_;
   }
@@ -546,6 +556,7 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
     READ_EOF = 0,
     READ_ERROR = -1,
     READ_BLOCKING = -2,
+    READ_NO_ERROR = -3,
   };
 
   /**
@@ -770,6 +781,8 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
   bool isBufferMovable_{false};
 
   bool peek_{false}; // Peek bytes.
+
+  int8_t readErr_{READ_NO_ERROR};      ///< The read error encountered, if any.
 };