Socket: Add oobReadable() and waitOOBReadable() FileHandle members
g0dil [Wed, 3 Dec 2008 13:12:31 +0000 (13:12 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@998 270642c3-0616-0410-b53a-bc976706d245

Packets/PacketImpl.cc
Packets/PacketImpl.cci
Socket/FileHandle.cc
Socket/FileHandle.cci
Socket/FileHandle.hh
Socket/FileHandle.ih

index f6d06ae..647d37f 100644 (file)
@@ -51,21 +51,6 @@ prefix_ senf::detail::PacketImpl::~PacketImpl()
             delete i->p;
 }
 
-// This function has a problem being inlined. Somehow, often when calling this, the size of the 
-// resulting inlined code would be huge. Need to further debug this. (Disabled inliningfor now)
-
-prefix_ void senf::detail::PacketImpl::release(refcount_t n)
-{
-    SENF_ASSERT(refcount_ >= n);
-    // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide,
-    // however the destructor will remove all PacketInterpreters from the list and will thereby
-    // decrement refcount -> only decrenebt refcount_ when *not* caling delete
-    if (refcount_ == n)
-        delete this;
-    else
-        refcount_ -= n;
-}
-
 // interpreter chain
 
 prefix_ void senf::detail::PacketImpl::appendInterpreter(PacketInterpreterBase * p)
index 4bd2bf3..e3c532e 100644 (file)
@@ -186,6 +186,22 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity()
     return data_.capacity();
 }
 
+// This function has a problem being inlined. Somehow, often when calling this, the size of the 
+// resulting inlined code would be huge?
+
+prefix_ void senf::detail::PacketImpl::release(refcount_t n)
+{
+    SENF_ASSERT(refcount_ >= n);
+    // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide,
+    // however the destructor will remove all PacketInterpreters from the list and will thereby
+    // decrement refcount -> only decrenebt refcount_ when *not* caling delete
+    if (refcount_ == n)
+        delete this;
+    else
+        refcount_ -= n;
+}
+
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::detail::PacketImpl::Guard
 
index baafe7a..5ee1afe 100644 (file)
@@ -111,13 +111,13 @@ prefix_ void senf::FileBody::blocking(bool status)
 /* We don't take POLLIN/POLLOUT as argument to avoid having to include
    sys/poll.h in the .cci file (and therefore indirectly into the .hh
    and then every file which uses FileHandle) */
-prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, bool block)
+prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, bool block, bool oob)
     const
 {
     struct ::pollfd pfd;
     ::memset(&pfd,0,sizeof(pfd));
     pfd.fd = fd;
-    pfd.events = incoming?POLLIN:POLLOUT;
+    pfd.events = incoming?(oob?POLLPRI:POLLIN):POLLOUT;
     int rv = -1;
     do {
         rv = ::poll(&pfd,1,block?-1:0);
index e04980a..5cbfce4 100644 (file)
@@ -93,6 +93,18 @@ prefix_ void senf::FileBody::waitWriteable()
     pollCheck(fd(),false,true);
 }
 
+prefix_ bool senf::FileBody::oobReadable()
+    const
+{
+    return pollCheck(fd(),true,false,true);
+}
+
+prefix_ void senf::FileBody::waitOOBReadable()
+    const
+{
+    pollCheck(fd(),true,true,true);
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::FileHandle
 
@@ -143,6 +155,18 @@ prefix_ void senf::FileHandle::waitWriteable()
     body().waitWriteable();
 }
 
+prefix_ bool senf::FileHandle::oobReadable()
+    const
+{
+    return body().oobReadable();
+}
+
+prefix_ void senf::FileHandle::waitOOBReadable()
+    const
+{
+    body().waitOOBReadable();
+}
+
 prefix_ bool senf::FileHandle::blocking()
     const
 {
index 7dbe5ba..cf3fc67 100644 (file)
@@ -143,6 +143,10 @@ namespace senf {
                                      ///< (ignoring blocking state)
         void waitWriteable() const;  ///< Wait, until a write on the handle would not block
                                      ///< (ignoring blocking state)
+        bool oobReadable() const;    ///< Check, whether a read of prioritized data on the handle 
+                                     ///< would not block (ignoring blocking state)
+        void waitOOBReadable() const; ///< Wait, until read of prioritized data on the handle does
+                                     ///< not block (ignoring blocking state)
 
         bool blocking() const;       ///< Return current blocking state
         void blocking(bool status);  ///< Set blocking state
index b1940c6..87b1920 100644 (file)
@@ -108,6 +108,8 @@ namespace senf {
         void waitReadable() const;
         bool writeable() const;
         void waitWriteable() const;
+        bool oobReadable() const;
+        void waitOOBReadable() const;
 
         bool blocking() const;
         void blocking(bool status);
@@ -140,7 +142,7 @@ namespace senf {
     protected:
 
     private:
-        bool pollCheck(int fd, bool incoming, bool block=false) const;
+        bool pollCheck(int fd, bool incoming, bool block=false, bool oob=false) const;
 
         int fd_;
     };