Bug 1156352: Refactor |UnixSocketIOBuffer|, r=kmachulis

This patch moves memory management of |UnixSocketIOBuffer| into
|UnixSocketBuffer| and extends |UnixSocketIOBuffer| with send and
receive interfaces. The class is now the base for all socket-buffer
classes, such as |UnixSocketRawData| and |BluetoothDaemonPDU|.
This commit is contained in:
Thomas Zimmermann 2015-04-23 13:48:47 +02:00
parent d629372433
commit ab71ff982e
3 changed files with 84 additions and 25 deletions

View File

@ -68,8 +68,8 @@ public:
void GetHeader(uint8_t& aService, uint8_t& aOpcode,
uint16_t& aPayloadSize);
ssize_t Send(int aFd);
ssize_t Receive(int aFd);
ssize_t Send(int aFd) override;
ssize_t Receive(int aFd) override;
int AcquireFd();

View File

@ -18,10 +18,10 @@ namespace ipc {
// UnixSocketIOBuffer
//
UnixSocketIOBuffer::UnixSocketIOBuffer(const void* aData, size_t aSize)
: mSize(aSize)
, mOffset(0)
, mAvailableSpace(aSize)
UnixSocketBuffer::UnixSocketBuffer(const void* aData, size_t aSize)
: mSize(aSize)
, mOffset(0)
, mAvailableSpace(aSize)
{
MOZ_ASSERT(aData || !mSize);
@ -29,19 +29,19 @@ UnixSocketIOBuffer::UnixSocketIOBuffer(const void* aData, size_t aSize)
memcpy(mData, aData, mSize);
}
UnixSocketIOBuffer::UnixSocketIOBuffer(size_t aAvailableSpace)
: mSize(0)
, mOffset(0)
, mAvailableSpace(aAvailableSpace)
UnixSocketBuffer::UnixSocketBuffer(size_t aAvailableSpace)
: mSize(0)
, mOffset(0)
, mAvailableSpace(aAvailableSpace)
{
mData = new uint8_t[mAvailableSpace];
}
UnixSocketIOBuffer::~UnixSocketIOBuffer()
UnixSocketBuffer::~UnixSocketBuffer()
{ }
const uint8_t*
UnixSocketIOBuffer::Consume(size_t aLen)
UnixSocketBuffer::Consume(size_t aLen)
{
if (NS_WARN_IF(GetSize() < aLen)) {
return nullptr;
@ -52,7 +52,7 @@ UnixSocketIOBuffer::Consume(size_t aLen)
}
nsresult
UnixSocketIOBuffer::Read(void* aValue, size_t aLen)
UnixSocketBuffer::Read(void* aValue, size_t aLen)
{
const uint8_t* data = Consume(aLen);
if (!data) {
@ -63,7 +63,7 @@ UnixSocketIOBuffer::Read(void* aValue, size_t aLen)
}
uint8_t*
UnixSocketIOBuffer::Append(size_t aLen)
UnixSocketBuffer::Append(size_t aLen)
{
if (((mAvailableSpace - mSize) < aLen)) {
size_t availableSpace = mAvailableSpace + std::max(mAvailableSpace, aLen);
@ -78,7 +78,7 @@ UnixSocketIOBuffer::Append(size_t aLen)
}
nsresult
UnixSocketIOBuffer::Write(const void* aValue, size_t aLen)
UnixSocketBuffer::Write(const void* aValue, size_t aLen)
{
uint8_t* data = Append(aLen);
if (!data) {
@ -89,7 +89,7 @@ UnixSocketIOBuffer::Write(const void* aValue, size_t aLen)
}
void
UnixSocketIOBuffer::CleanupLeadingSpace()
UnixSocketBuffer::CleanupLeadingSpace()
{
if (GetLeadingSpace()) {
if (GetSize() <= GetLeadingSpace()) {
@ -101,6 +101,21 @@ UnixSocketIOBuffer::CleanupLeadingSpace()
}
}
//
// UnixSocketIOBuffer
//
UnixSocketIOBuffer::UnixSocketIOBuffer(const void* aData, size_t aSize)
: UnixSocketBuffer(aData, aSize)
{ }
UnixSocketIOBuffer::UnixSocketIOBuffer(size_t aAvailableSpace)
: UnixSocketBuffer(aAvailableSpace)
{ }
UnixSocketIOBuffer::~UnixSocketIOBuffer()
{ }
//
// UnixSocketRawData
//

View File

@ -23,12 +23,18 @@ namespace mozilla {
namespace ipc {
//
// UnixSocketIOBuffer
// UnixSocketBuffer
//
class UnixSocketIOBuffer
/**
* |UnixSocketBuffer| implements a FIFO buffer that stores raw socket
* data, either for sending on a socket or received from a socket.
*/
class UnixSocketBuffer
{
public:
virtual ~UnixSocketBuffer();
const uint8_t* GetData() const
{
return mData + mOffset;
@ -110,15 +116,13 @@ public:
protected:
/* This constructor copies aData of aSize bytes length into the
* new instance of |UnixSocketIOBuffer|.
* new instance of |UnixSocketBuffer|.
*/
UnixSocketIOBuffer(const void* aData, size_t aSize);
UnixSocketBuffer(const void* aData, size_t aSize);
/* This constructor reserves aAvailableSpace bytes of space.
*/
UnixSocketIOBuffer(size_t aAvailableSpace);
~UnixSocketIOBuffer();
UnixSocketBuffer(size_t aAvailableSpace);
size_t GetLeadingSpace() const
{
@ -164,6 +168,46 @@ private:
nsAutoArrayPtr<uint8_t> mData;
};
//
// UnixSocketIOBuffer
//
/**
* |UnixSocketIOBuffer| is a |UnixSocketBuffer| that supports being
* received on a socket or being send on a socket. Network protocols
* might differ in their exact usage of Unix socket functions and
* |UnixSocketIOBuffer| provides a protocol-neutral interface.
*/
class UnixSocketIOBuffer : public UnixSocketBuffer
{
public:
virtual ~UnixSocketIOBuffer();
/**
* Receives data from aFd at the end of the buffer. The returned value
* is the number of newly received bytes, or 0 if the peer shut down
* its connection, or a negative value on errors.
*/
virtual ssize_t Receive(int aFd) = 0;
/**
* Sends data to aFd from the beginning of the buffer. The returned value
* is the number of bytes written, or a negative value on error.
*/
virtual ssize_t Send(int aFd) = 0;
protected:
/* This constructor copies aData of aSize bytes length into the
* new instance of |UnixSocketIOBuffer|.
*/
UnixSocketIOBuffer(const void* aData, size_t aSize);
/* This constructor reserves aAvailableSpace bytes of space.
*/
UnixSocketIOBuffer(size_t aAvailableSpace);
};
//
// UnixSocketRawData
//
@ -186,13 +230,13 @@ public:
* is the number of newly received bytes, or 0 if the peer shut down
* its connection, or a negative value on errors.
*/
ssize_t Receive(int aFd);
ssize_t Receive(int aFd) override;
/**
* Sends data to aFd from the beginning of the buffer. The returned value
* is the number of bytes written, or a negative value on error.
*/
ssize_t Send(int aFd);
ssize_t Send(int aFd) override;
};
enum SocketConnectionStatus {