mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
d629372433
commit
ab71ff982e
@ -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();
|
||||
|
||||
|
@ -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
|
||||
//
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user