зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 8e247550d6cf (bug 1411984) for bustage.
This commit is contained in:
Родитель
a6836496b3
Коммит
37d7c47eef
|
@ -15,28 +15,18 @@ namespace mozilla {
|
|||
namespace layout {
|
||||
|
||||
class PRFileDescStream : public mozilla::gfx::EventStream {
|
||||
// Most writes, as seen in the print IPC use case, are very small (<32 bytes),
|
||||
// with a small number of very large (>40KB) writes. Writes larger than this
|
||||
// value are not buffered.
|
||||
static const size_t kBufferSize = 1024;
|
||||
public:
|
||||
PRFileDescStream() : mFd(nullptr), mBuffer(nullptr), mBufferPos(0),
|
||||
mGood(true) {}
|
||||
PRFileDescStream() : mFd(nullptr), mGood(true) {}
|
||||
|
||||
void OpenFD(PRFileDesc* aFd) {
|
||||
MOZ_ASSERT(!IsOpen());
|
||||
mFd = aFd;
|
||||
mGood = true;
|
||||
mBuffer.reset(new uint8_t[kBufferSize]);
|
||||
mBufferPos = 0;
|
||||
}
|
||||
|
||||
void Close() {
|
||||
Flush();
|
||||
PR_Close(mFd);
|
||||
mFd = nullptr;
|
||||
mBuffer.reset();
|
||||
mBufferPos = 0;
|
||||
}
|
||||
|
||||
bool IsOpen() {
|
||||
|
@ -44,46 +34,23 @@ public:
|
|||
}
|
||||
|
||||
void Flush() {
|
||||
// We need to be API compatible with std::ostream, and so we silently handle
|
||||
// flushes on a closed FD.
|
||||
if (IsOpen() && mBufferPos > 0) {
|
||||
PR_Write(mFd, static_cast<const void*>(mBuffer.get()), mBufferPos);
|
||||
mBufferPos = 0;
|
||||
}
|
||||
// For std::ostream this flushes any internal buffers. PRFileDesc's IO isn't
|
||||
// buffered, so nothing to do here.
|
||||
}
|
||||
|
||||
void Seek(PRInt32 aOffset, PRSeekWhence aWhence) {
|
||||
Flush();
|
||||
PR_Seek(mFd, aOffset, aWhence);
|
||||
}
|
||||
|
||||
void write(const char* aData, size_t aSize) {
|
||||
// See comment in Flush().
|
||||
// We need to be API compatible with std::ostream, and so we silently handle
|
||||
// writes on a closed FD.
|
||||
if (IsOpen()) {
|
||||
// If we're writing more data than could ever fit in our buffer, flush the
|
||||
// buffer and write directly.
|
||||
if (aSize > kBufferSize) {
|
||||
Flush();
|
||||
PR_Write(mFd, static_cast<const void*>(aData), aSize);
|
||||
// If our write could fit in our buffer, but doesn't because the buffer is
|
||||
// partially full, write to the buffer, flush the buffer, and then write
|
||||
// the rest of the data to the buffer.
|
||||
} else if (aSize > AvailableBufferSpace()) {
|
||||
size_t length = AvailableBufferSpace();
|
||||
WriteToBuffer(aData, length);
|
||||
Flush();
|
||||
|
||||
MOZ_ASSERT(aSize <= kBufferSize);
|
||||
WriteToBuffer(aData + length, aSize - length);
|
||||
// Write fits in the buffer.
|
||||
} else {
|
||||
WriteToBuffer(aData, aSize);
|
||||
}
|
||||
PR_Write(mFd, static_cast<const void*>(aData), aSize);
|
||||
}
|
||||
}
|
||||
|
||||
void read(char* aOut, size_t aSize) {
|
||||
Flush();
|
||||
PRInt32 res = PR_Read(mFd, static_cast<void*>(aOut), aSize);
|
||||
mGood = res >= 0 && ((size_t)res == aSize);
|
||||
}
|
||||
|
@ -93,19 +60,7 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
size_t AvailableBufferSpace() {
|
||||
return kBufferSize - mBufferPos;
|
||||
}
|
||||
|
||||
void WriteToBuffer(const char* aData, size_t aSize) {
|
||||
MOZ_ASSERT(aSize <= AvailableBufferSpace());
|
||||
memcpy(mBuffer.get() + mBufferPos, aData, aSize);
|
||||
mBufferPos += aSize;
|
||||
}
|
||||
|
||||
PRFileDesc* mFd;
|
||||
std::unique_ptr<uint8_t[]> mBuffer;
|
||||
size_t mBufferPos;
|
||||
bool mGood;
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче