diff --git a/Packets/PacketImpl.cc b/Packets/PacketImpl.cc index f6d06ae65e7cfb2928980b1e924fbfaa518f7a58..647d37f143a2634f2aed1ab976eef08cc2068eaf 100644 --- a/Packets/PacketImpl.cc +++ b/Packets/PacketImpl.cc @@ -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) diff --git a/Packets/PacketImpl.cci b/Packets/PacketImpl.cci index 4bd2bf31d34b328a6cd37b87e4925b41fa7ef6a2..e3c532eb00d4a6938b0dce7877c69f1ee5bb2946 100644 --- a/Packets/PacketImpl.cci +++ b/Packets/PacketImpl.cci @@ -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 diff --git a/Socket/FileHandle.cc b/Socket/FileHandle.cc index baafe7a58d5da16a14b0f508e5c34b367659c44a..5ee1afedab6e322d55c76ce5df352c24121254b1 100644 --- a/Socket/FileHandle.cc +++ b/Socket/FileHandle.cc @@ -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); diff --git a/Socket/FileHandle.cci b/Socket/FileHandle.cci index e04980a3ac4081bba7478ecd5981f782d560dcd6..5cbfce4cc63e54bf082a2b516aad50a908b14e33 100644 --- a/Socket/FileHandle.cci +++ b/Socket/FileHandle.cci @@ -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 { diff --git a/Socket/FileHandle.hh b/Socket/FileHandle.hh index 7dbe5ba0a908137579c752ae7b92d6d1eda321c0..cf3fc67663eb666cff6a6d12a268b8b5cfe15828 100644 --- a/Socket/FileHandle.hh +++ b/Socket/FileHandle.hh @@ -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 diff --git a/Socket/FileHandle.ih b/Socket/FileHandle.ih index b1940c69e34c9896db4027cf218511b24e5eab18..87b1920ea44d8e86c409c4c02117047b92849f86 100644 --- a/Socket/FileHandle.ih +++ b/Socket/FileHandle.ih @@ -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_; };