mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
5a5b052a7c
- Bug 930218 part 1. Factor out the computation of block-size taken up by box-sizing into a separate function so we can reuse it. r=dbaron (22033f4184) - Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron (041711f58f) - Bug 1235306 - Fix -Wimplicit-fallthrough warnings in layout/. r=dholbert (581c212254) - Bug 1074971 - Add support for reserved commandkey combinations that can't be handled by content (e10s-only feature). r=smaug (e43d39dcef) - Bug 1186799 part.1 nsHTMLEditorEventListener should commit composition when it receives unacceptable mousedown event r=smaug (17f2c48e96) - Bug 1230216 - Changing nsIDOM*Event interfaces so that they don't inherit nsIDOMEvent. r=smaug (df77f91ecc) - fix cancelBubble situation and align to gecko (bc133dc50a) - Bug 1211402. Re-enable the upload step, but take out the stuff that no longer works (as in, everything.) r=me (cb7abd67d2) - align (bac4aec6cc) - Bug 1243608: P1. Only use video time if video frame contains seek target. r=cpearce (21d9e988ed) - Bug 1244477: Offset seek time by start time. r=jwwang (743c24b2f7) - Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce (6ff30b4b65) - Bug 1243608: P3. Make SeekTarget::mTime a TimeUnit object. r=cpearce (357d9864de) - Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce (53b476c62d) - Bug 1159343: Interrupt seek early when possible. r=jwwang (9e26e69593) - Bug 1243608: P5. Add type utility methods to SeekTarget class. r=cpearce (8e740bab50) - Bug 1243608: P6. Only seek audio to video seek time when performing a fast seek. r=cpearce (d2a51a71f0) - Bug 1233650. Part 1 - extract OutputStreamManager to its own file. r=roc. (52d533f923) - Bug 1230882. Part 2 - remove DecodedStream::BeginShutdown() and other unused code. r=roc. (b2820b8f14) - Bug 1231091. Part 1 - Add mVideoCompleted so MDSM can check when audio/video is done rendering. This removes the only caller of DecodedStream::IsFinished(). r=roc. (536f63e385) - Bug 1146086: Properly marking overridden member with override keyword. v2. a=bustage (b6ed1b4e6c) - Bug 1177243 - Use PodZero rather than memset in WebM decoders. r=rillian (f9853b72ee) - Bug 1230054: Remove unused WebMReader. r=kinetik (1f88fe3c43) - Bug 1230054: Add missing headers ON A CLOSED TREE. r=me (6e33accf03) - Bug 1231091. Part 2 - return correct promises when audio/video track is asked. r=roc. (aef6342e59) - Bug 1231091. Part 3 - resolve the end promise when all frames are rendered. r=roc. (bbb180dd90) - Bug 1231091. Part 4 - ensure the end promise is resolved in the special case where video duration is 0. r=roc. (7835c31e75) - Bug 1231091. Part 5 - Remove DecodedStream::IsFinished() and unused code. r=roc. (6dd02e5d6b) - Bug 1231091. Part 6 - fix test_streams_element_capture.html timeout. r=roc. (8aae5c09cc) - Bug 1232520 - dont' invoke AbstractThread::MainThread()->Dispatch() to avoid reentrant of AutoTaskDispatcher during tail dispatching phase. r=jya. (5434d0f370) - Bug 1233650. Part 2 - make OutputStreamManager ref-counted so it can be shared between MDSM and DecodedStream. r=roc. (93e7d0e065) - Bug 1233650. Part 3 - move creation of OutputStreamManager from DecodedStream to MDSM. r=roc. (a469dbcc9f) - Bug 1233650. Part 4 - remove unused functions from DecodedStream. r=roc. (ec8753365e) - Bug 1248314. Part 1 - Since OutputStreamManager::Connect/Disconnect is tightly coupled with the constructor/destructor of DecodedStreamData, it would improve cohesion to let DecodedStreamData manage an OutputStreamManager and know when to call OutputStreamManager::Connect/Disconnect. r=roc. (467d1472ca) - Bug 1234424. Part 1 - share the underlying value of MDSM::mSameOriginMedia with DecodedStream. r=roc. (ff0abefb26) - Bug 1234424. Part 2 - remove unused code. r=roc. (5a8266779b) - Bug 1248314. part 2 - move track initialization code into the constructor of DecodedStreamData. r=roc. (4d57f47654) - Bug 1248229. Part 1 - add test case to test if playback can work correctly after GC. r=roc. (83c81dc7cc) - Bug 1248229. Part 2 - GC might happen in between OutputStreamManager::Disconnect() and OutputStreamManager::Connect(). We need to check if the stream is already destroyed before trying to connect it. r=roc. (c5a0ed670c) - remove PM leftover (ed9ce00aad) - Bug 1236703: P1. Add debugging information for MSE to about:media plugin. r=kentuckyfriedtakahe (4385a86197) - Bug 1236703: P2. Add methods to retrieve debugging data on plain readers. r=jwwang (34bf637124) - Bug 1236703: P3. Add moz specific method to retrieve debug data to media object IDL. r=bz (65c95eff74) - Bug 1194721: Add additional PDU pack and unpack functions, r=shuang (d6ae416a10) - Bug 1261307: Convert Unix socket IPC code to |UniquePtr|, r=nfroyd (cd797f4581) - Bug 1236574 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in SocketBase subclasses; r=tzimmerman (6a20e9e905) - Bug 1239207 - Don't process IPDL when not compiling; r=glandium (20ba7fb311) - Bug 1210099 - Use diagnostic assert for union discriminator checks (r=jld) (74844eee1b) - Bug 1208226 - Don't crash when failing to map a segment of shared memory. r=sotaro, billm (1822a634d9) - Bug 1236635 - Fix compile error in IPC unit tests (r=jld) (c82e0bfe61) - Bug 1263429 - Don't build libevent with sysctl on Linux. r=billm (00f248f61e) - Bug 1304266 - Remove libevent workaround for MacOS 10.4 bug (r=dvander) a=jcristau (676758a926) - Bug 1241776 - turn ENABLE_SHARED_ARRAY_BUFFER on for all channels. r=nbp (dc53fff545) - Bug 1248851 part 1 - Explicitly mark some release() calls result-unused. r=Waldo (b377e3d86e) - Bug 1246697 - Use simpler semantics for PersistentRooted<Traceable>; r=sfink (7afab5c807) - bug 1225649 use CreatePlanarYCbCrImage() now that CreateImage() is gone r=dvander (b8a30f3d84) - Bug 1234092: P1. Remove GStreamer support. r=kentuckyfriedtakahe (bf6a5d8811) - Bug 1234092: P2. Remove GStreamer check from configure. r=glandium (73b69b41db) - remove configure options (f9585af0d1) - Bug 1168309 - Add the define, MOZ_GONK_MEDIACODEC, to dom/media. r=cpearce. (a4481af932) - Bug 1240616 - mach mochitest-run suggests deprecated commands as an alternative r=cmanchester (17687db974) - Bug 1249838 - Avoid dependency from the mozconfig loader on mach. r=gps (a88506c027) - Bug 382721 - Part 0: Add missing includes and namespaces. r=jrmuizel (eecf253c5e)
444 lines
8.9 KiB
C++
444 lines
8.9 KiB
C++
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
|
|
/* vim: set ts=2 et sw=2 tw=80: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#include "SocketBase.h"
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, MOZ_COUNT_DTOR
|
|
|
|
namespace mozilla {
|
|
namespace ipc {
|
|
|
|
//
|
|
// UnixSocketIOBuffer
|
|
//
|
|
|
|
UnixSocketBuffer::UnixSocketBuffer()
|
|
: mSize(0)
|
|
, mOffset(0)
|
|
, mAvailableSpace(0)
|
|
, mData(nullptr)
|
|
{
|
|
MOZ_COUNT_CTOR(UnixSocketBuffer);
|
|
}
|
|
|
|
UnixSocketBuffer::~UnixSocketBuffer()
|
|
{
|
|
MOZ_COUNT_DTOR(UnixSocketBuffer);
|
|
|
|
// Make sure that the caller released the buffer's memory.
|
|
MOZ_ASSERT(!GetBuffer());
|
|
}
|
|
|
|
const uint8_t*
|
|
UnixSocketBuffer::Consume(size_t aLen)
|
|
{
|
|
if (NS_WARN_IF(GetSize() < aLen)) {
|
|
return nullptr;
|
|
}
|
|
uint8_t* data = mData + mOffset;
|
|
mOffset += aLen;
|
|
return data;
|
|
}
|
|
|
|
nsresult
|
|
UnixSocketBuffer::Read(void* aValue, size_t aLen)
|
|
{
|
|
const uint8_t* data = Consume(aLen);
|
|
if (!data) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
memcpy(aValue, data, aLen);
|
|
return NS_OK;
|
|
}
|
|
|
|
uint8_t*
|
|
UnixSocketBuffer::Append(size_t aLen)
|
|
{
|
|
if (((mAvailableSpace - mSize) < aLen)) {
|
|
size_t availableSpace = mAvailableSpace + std::max(mAvailableSpace, aLen);
|
|
uint8_t* data = new uint8_t[availableSpace];
|
|
memcpy(data, mData, mSize);
|
|
mData = data;
|
|
mAvailableSpace = availableSpace;
|
|
}
|
|
uint8_t* data = mData + mSize;
|
|
mSize += aLen;
|
|
return data;
|
|
}
|
|
|
|
nsresult
|
|
UnixSocketBuffer::Write(const void* aValue, size_t aLen)
|
|
{
|
|
uint8_t* data = Append(aLen);
|
|
if (!data) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
memcpy(data, aValue, aLen);
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
UnixSocketBuffer::CleanupLeadingSpace()
|
|
{
|
|
if (GetLeadingSpace()) {
|
|
if (GetSize() <= GetLeadingSpace()) {
|
|
memcpy(mData, GetData(), GetSize());
|
|
} else {
|
|
memmove(mData, GetData(), GetSize());
|
|
}
|
|
mOffset = 0;
|
|
}
|
|
}
|
|
|
|
//
|
|
// UnixSocketIOBuffer
|
|
//
|
|
|
|
UnixSocketIOBuffer::UnixSocketIOBuffer()
|
|
{
|
|
MOZ_COUNT_CTOR_INHERITED(UnixSocketIOBuffer, UnixSocketBuffer);
|
|
}
|
|
|
|
UnixSocketIOBuffer::~UnixSocketIOBuffer()
|
|
{
|
|
MOZ_COUNT_DTOR_INHERITED(UnixSocketIOBuffer, UnixSocketBuffer);
|
|
}
|
|
|
|
//
|
|
// UnixSocketRawData
|
|
//
|
|
|
|
UnixSocketRawData::UnixSocketRawData(const void* aData, size_t aSize)
|
|
{
|
|
MOZ_ASSERT(aData || !aSize);
|
|
|
|
MOZ_COUNT_CTOR_INHERITED(UnixSocketRawData, UnixSocketIOBuffer);
|
|
|
|
ResetBuffer(static_cast<uint8_t*>(memcpy(new uint8_t[aSize], aData, aSize)),
|
|
0, aSize, aSize);
|
|
}
|
|
|
|
UnixSocketRawData::UnixSocketRawData(UniquePtr<uint8_t[]> aData, size_t aSize)
|
|
{
|
|
MOZ_ASSERT(aData || !aSize);
|
|
|
|
MOZ_COUNT_CTOR_INHERITED(UnixSocketRawData, UnixSocketIOBuffer);
|
|
|
|
ResetBuffer(aData.release(), 0, aSize, aSize);
|
|
}
|
|
|
|
UnixSocketRawData::UnixSocketRawData(size_t aSize)
|
|
{
|
|
MOZ_COUNT_CTOR_INHERITED(UnixSocketRawData, UnixSocketIOBuffer);
|
|
|
|
ResetBuffer(new uint8_t[aSize], 0, 0, aSize);
|
|
}
|
|
|
|
UnixSocketRawData::~UnixSocketRawData()
|
|
{
|
|
MOZ_COUNT_DTOR_INHERITED(UnixSocketRawData, UnixSocketIOBuffer);
|
|
|
|
UniquePtr<uint8_t[]> data(GetBuffer());
|
|
ResetBuffer(nullptr, 0, 0, 0);
|
|
}
|
|
|
|
ssize_t
|
|
UnixSocketRawData::Receive(int aFd)
|
|
{
|
|
if (!GetTrailingSpace()) {
|
|
if (!GetLeadingSpace()) {
|
|
return -1; /* buffer is full */
|
|
}
|
|
/* free up space at the end of data buffer */
|
|
CleanupLeadingSpace();
|
|
}
|
|
|
|
ssize_t res =
|
|
TEMP_FAILURE_RETRY(read(aFd, GetTrailingBytes(), GetTrailingSpace()));
|
|
|
|
if (res < 0) {
|
|
/* I/O error */
|
|
return -1;
|
|
} else if (!res) {
|
|
/* EOF or peer shutdown sending */
|
|
return 0;
|
|
}
|
|
|
|
Append(res); /* mark read data as 'valid' */
|
|
|
|
return res;
|
|
}
|
|
|
|
ssize_t
|
|
UnixSocketRawData::Send(int aFd)
|
|
{
|
|
if (!GetSize()) {
|
|
return 0;
|
|
}
|
|
|
|
ssize_t res = TEMP_FAILURE_RETRY(write(aFd, GetData(), GetSize()));
|
|
|
|
if (res < 0) {
|
|
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
return 0; /* socket is blocked; try again later */
|
|
}
|
|
return -1;
|
|
} else if (!res) {
|
|
/* nothing written */
|
|
return 0;
|
|
}
|
|
|
|
Consume(res);
|
|
|
|
return res;
|
|
}
|
|
|
|
//
|
|
// SocketBase
|
|
//
|
|
|
|
SocketConnectionStatus
|
|
SocketBase::GetConnectionStatus() const
|
|
{
|
|
return mConnectionStatus;
|
|
}
|
|
|
|
int
|
|
SocketBase::GetSuggestedConnectDelayMs() const
|
|
{
|
|
return mConnectDelayMs;
|
|
}
|
|
|
|
void
|
|
SocketBase::NotifySuccess()
|
|
{
|
|
mConnectionStatus = SOCKET_CONNECTED;
|
|
mConnectTimestamp = PR_IntervalNow();
|
|
OnConnectSuccess();
|
|
}
|
|
|
|
void
|
|
SocketBase::NotifyError()
|
|
{
|
|
mConnectionStatus = SOCKET_DISCONNECTED;
|
|
mConnectDelayMs = CalculateConnectDelayMs();
|
|
mConnectTimestamp = 0;
|
|
OnConnectError();
|
|
}
|
|
|
|
void
|
|
SocketBase::NotifyDisconnect()
|
|
{
|
|
mConnectionStatus = SOCKET_DISCONNECTED;
|
|
mConnectDelayMs = CalculateConnectDelayMs();
|
|
mConnectTimestamp = 0;
|
|
OnDisconnect();
|
|
}
|
|
|
|
uint32_t
|
|
SocketBase::CalculateConnectDelayMs() const
|
|
{
|
|
uint32_t connectDelayMs = mConnectDelayMs;
|
|
|
|
if (mConnectTimestamp && (PR_IntervalNow()-mConnectTimestamp) > connectDelayMs) {
|
|
// reset delay if connection has been opened for a while, or...
|
|
connectDelayMs = 0;
|
|
} else if (!connectDelayMs) {
|
|
// ...start with a delay of ~1 sec, or...
|
|
connectDelayMs = 1<<10;
|
|
} else if (connectDelayMs < (1<<16)) {
|
|
// ...otherwise increase delay by a factor of 2
|
|
connectDelayMs <<= 1;
|
|
}
|
|
return connectDelayMs;
|
|
}
|
|
|
|
SocketBase::SocketBase()
|
|
: mConnectionStatus(SOCKET_DISCONNECTED)
|
|
, mConnectTimestamp(0)
|
|
, mConnectDelayMs(0)
|
|
{
|
|
MOZ_COUNT_CTOR(SocketBase);
|
|
}
|
|
|
|
SocketBase::~SocketBase()
|
|
{
|
|
MOZ_ASSERT(mConnectionStatus == SOCKET_DISCONNECTED);
|
|
|
|
MOZ_COUNT_DTOR(SocketBase);
|
|
}
|
|
|
|
void
|
|
SocketBase::SetConnectionStatus(SocketConnectionStatus aConnectionStatus)
|
|
{
|
|
mConnectionStatus = aConnectionStatus;
|
|
}
|
|
|
|
//
|
|
// SocketIOBase
|
|
//
|
|
|
|
SocketIOBase::SocketIOBase(MessageLoop* aConsumerLoop)
|
|
: mConsumerLoop(aConsumerLoop)
|
|
{
|
|
MOZ_ASSERT(mConsumerLoop);
|
|
|
|
MOZ_COUNT_CTOR(SocketIOBase);
|
|
}
|
|
|
|
SocketIOBase::~SocketIOBase()
|
|
{
|
|
MOZ_COUNT_DTOR(SocketIOBase);
|
|
}
|
|
|
|
MessageLoop*
|
|
SocketIOBase::GetConsumerThread() const
|
|
{
|
|
return mConsumerLoop;
|
|
}
|
|
|
|
bool
|
|
SocketIOBase::IsConsumerThread() const
|
|
{
|
|
return GetConsumerThread() == MessageLoop::current();
|
|
}
|
|
|
|
//
|
|
// SocketEventTask
|
|
//
|
|
|
|
SocketEventTask::SocketEventTask(SocketIOBase* aIO, SocketEvent aEvent)
|
|
: SocketTask<SocketIOBase>(aIO)
|
|
, mEvent(aEvent)
|
|
{
|
|
MOZ_COUNT_CTOR(SocketEventTask);
|
|
}
|
|
|
|
SocketEventTask::~SocketEventTask()
|
|
{
|
|
MOZ_COUNT_DTOR(SocketEventTask);
|
|
}
|
|
|
|
void
|
|
SocketEventTask::Run()
|
|
{
|
|
SocketIOBase* io = SocketTask<SocketIOBase>::GetIO();
|
|
|
|
MOZ_ASSERT(io->IsConsumerThread());
|
|
|
|
if (NS_WARN_IF(io->IsShutdownOnConsumerThread())) {
|
|
// Since we've already explicitly closed and the close
|
|
// happened before this, this isn't really an error.
|
|
return;
|
|
}
|
|
|
|
SocketBase* socketBase = io->GetSocketBase();
|
|
MOZ_ASSERT(socketBase);
|
|
|
|
if (mEvent == CONNECT_SUCCESS) {
|
|
socketBase->NotifySuccess();
|
|
} else if (mEvent == CONNECT_ERROR) {
|
|
socketBase->NotifyError();
|
|
} else if (mEvent == DISCONNECT) {
|
|
socketBase->NotifyDisconnect();
|
|
}
|
|
}
|
|
|
|
//
|
|
// SocketRequestClosingTask
|
|
//
|
|
|
|
SocketRequestClosingTask::SocketRequestClosingTask(SocketIOBase* aIO)
|
|
: SocketTask<SocketIOBase>(aIO)
|
|
{
|
|
MOZ_COUNT_CTOR(SocketRequestClosingTask);
|
|
}
|
|
|
|
SocketRequestClosingTask::~SocketRequestClosingTask()
|
|
{
|
|
MOZ_COUNT_DTOR(SocketRequestClosingTask);
|
|
}
|
|
|
|
void
|
|
SocketRequestClosingTask::Run()
|
|
{
|
|
SocketIOBase* io = SocketTask<SocketIOBase>::GetIO();
|
|
|
|
MOZ_ASSERT(io->IsConsumerThread());
|
|
|
|
if (NS_WARN_IF(io->IsShutdownOnConsumerThread())) {
|
|
// Since we've already explicitly closed and the close
|
|
// happened before this, this isn't really an error.
|
|
return;
|
|
}
|
|
|
|
SocketBase* socketBase = io->GetSocketBase();
|
|
MOZ_ASSERT(socketBase);
|
|
|
|
socketBase->Close();
|
|
}
|
|
|
|
//
|
|
// SocketDeleteInstanceTask
|
|
//
|
|
|
|
SocketDeleteInstanceTask::SocketDeleteInstanceTask(SocketIOBase* aIO)
|
|
: mIO(aIO)
|
|
{
|
|
MOZ_COUNT_CTOR(SocketDeleteInstanceTask);
|
|
}
|
|
|
|
SocketDeleteInstanceTask::~SocketDeleteInstanceTask()
|
|
{
|
|
MOZ_COUNT_DTOR(SocketDeleteInstanceTask);
|
|
}
|
|
|
|
void
|
|
SocketDeleteInstanceTask::Run()
|
|
{
|
|
mIO.reset(); // delete instance
|
|
}
|
|
|
|
//
|
|
// SocketIOShutdownTask
|
|
//
|
|
|
|
SocketIOShutdownTask::SocketIOShutdownTask(SocketIOBase* aIO)
|
|
: SocketIOTask<SocketIOBase>(aIO)
|
|
{
|
|
MOZ_COUNT_CTOR(SocketIOShutdownTask);
|
|
}
|
|
|
|
SocketIOShutdownTask::~SocketIOShutdownTask()
|
|
{
|
|
MOZ_COUNT_DTOR(SocketIOShutdownTask);
|
|
}
|
|
|
|
void
|
|
SocketIOShutdownTask::Run()
|
|
{
|
|
SocketIOBase* io = SocketIOTask<SocketIOBase>::GetIO();
|
|
|
|
MOZ_ASSERT(!io->IsConsumerThread());
|
|
MOZ_ASSERT(!io->IsShutdownOnIOThread());
|
|
|
|
// At this point, there should be no new events on the I/O thread
|
|
// after this one with the possible exception of an accept task,
|
|
// which ShutdownOnIOThread will cancel for us. We are now fully
|
|
// shut down, so we can send a message to the consumer thread to
|
|
// delete |io| safely knowing that it's not reference any longer.
|
|
io->ShutdownOnIOThread();
|
|
io->GetConsumerThread()->PostTask(FROM_HERE,
|
|
new SocketDeleteInstanceTask(io));
|
|
}
|
|
|
|
}
|
|
}
|