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()
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)
......
......@@ -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
......
......@@ -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);
......
......@@ -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
{
......
......@@ -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
......
......@@ -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_;
};
......
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