Skip to content
Snippets Groups Projects
Commit 700dc3be authored by g0dil's avatar g0dil
Browse files

Socket: Add oobReadable() and waitOOBReadable() FileHandle members

parent 28252d86
No related branches found
No related tags found
No related merge requests found
...@@ -51,21 +51,6 @@ prefix_ senf::detail::PacketImpl::~PacketImpl() ...@@ -51,21 +51,6 @@ prefix_ senf::detail::PacketImpl::~PacketImpl()
delete i->p; 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 // interpreter chain
prefix_ void senf::detail::PacketImpl::appendInterpreter(PacketInterpreterBase * p) prefix_ void senf::detail::PacketImpl::appendInterpreter(PacketInterpreterBase * p)
......
...@@ -186,6 +186,22 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity() ...@@ -186,6 +186,22 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity()
return data_.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 // senf::detail::PacketImpl::Guard
......
...@@ -111,13 +111,13 @@ prefix_ void senf::FileBody::blocking(bool status) ...@@ -111,13 +111,13 @@ prefix_ void senf::FileBody::blocking(bool status)
/* We don't take POLLIN/POLLOUT as argument to avoid having to include /* 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 sys/poll.h in the .cci file (and therefore indirectly into the .hh
and then every file which uses FileHandle) */ 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 const
{ {
struct ::pollfd pfd; struct ::pollfd pfd;
::memset(&pfd,0,sizeof(pfd)); ::memset(&pfd,0,sizeof(pfd));
pfd.fd = fd; pfd.fd = fd;
pfd.events = incoming?POLLIN:POLLOUT; pfd.events = incoming?(oob?POLLPRI:POLLIN):POLLOUT;
int rv = -1; int rv = -1;
do { do {
rv = ::poll(&pfd,1,block?-1:0); rv = ::poll(&pfd,1,block?-1:0);
......
...@@ -93,6 +93,18 @@ prefix_ void senf::FileBody::waitWriteable() ...@@ -93,6 +93,18 @@ prefix_ void senf::FileBody::waitWriteable()
pollCheck(fd(),false,true); 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 // senf::FileHandle
...@@ -143,6 +155,18 @@ prefix_ void senf::FileHandle::waitWriteable() ...@@ -143,6 +155,18 @@ prefix_ void senf::FileHandle::waitWriteable()
body().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() prefix_ bool senf::FileHandle::blocking()
const const
{ {
......
...@@ -143,6 +143,10 @@ namespace senf { ...@@ -143,6 +143,10 @@ namespace senf {
///< (ignoring blocking state) ///< (ignoring blocking state)
void waitWriteable() const; ///< Wait, until a write on the handle would not block void waitWriteable() const; ///< Wait, until a write on the handle would not block
///< (ignoring blocking state) ///< (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 bool blocking() const; ///< Return current blocking state
void blocking(bool status); ///< Set blocking state void blocking(bool status); ///< Set blocking state
......
...@@ -108,6 +108,8 @@ namespace senf { ...@@ -108,6 +108,8 @@ namespace senf {
void waitReadable() const; void waitReadable() const;
bool writeable() const; bool writeable() const;
void waitWriteable() const; void waitWriteable() const;
bool oobReadable() const;
void waitOOBReadable() const;
bool blocking() const; bool blocking() const;
void blocking(bool status); void blocking(bool status);
...@@ -140,7 +142,7 @@ namespace senf { ...@@ -140,7 +142,7 @@ namespace senf {
protected: protected:
private: 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_; int fd_;
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment