Backed out 8 changesets (bug 1161020) for b2g ics emulator debug mochitest memory leaks on a CLOSED TREE

Backed out changeset 976e19eac8b5 (bug 1161020)
Backed out changeset 4f782be31f87 (bug 1161020)
Backed out changeset 384de663084c (bug 1161020)
Backed out changeset a8f42d85ce3f (bug 1161020)
Backed out changeset ac23206e80bd (bug 1161020)
Backed out changeset 34a20b05af6c (bug 1161020)
Backed out changeset 13753f9043f7 (bug 1161020)
Backed out changeset f90b8d3d6b70 (bug 1161020)
This commit is contained in:
Carsten "Tomcat" Book
2015-05-18 15:01:27 +02:00
parent aa2289ee85
commit 35ddcbe0b8
26 changed files with 908 additions and 1595 deletions

View File

@@ -28,7 +28,8 @@ public:
ListenSocketIO(MessageLoop* mIOLoop,
ListenSocket* aListenSocket,
UnixSocketConnector* aConnector);
UnixSocketConnector* aConnector,
const nsACString& aAddress);
~ListenSocketIO();
void GetSocketAddr(nsAString& aAddrStr) const;
@@ -63,6 +64,9 @@ public:
private:
void FireSocketError();
// Set up flags on file descriptor.
static bool SetSocketFlags(int aFd);
/**
* Consumer pointer. Non-thread safe RefPtr, so should only be manipulated
* directly from main thread. All non-main-thread accesses should happen with
@@ -81,27 +85,33 @@ private:
bool mShuttingDownOnIOThread;
/**
* Number of valid bytes in |mAddress|
* Address we are connecting to, assuming we are creating a client connection.
*/
socklen_t mAddressLength;
nsCString mAddress;
/**
* Address structure of the socket currently in use
* Size of the socket address struct
*/
struct sockaddr_storage mAddress;
socklen_t mAddrSize;
/**
* Address struct of the socket currently in use
*/
sockaddr_any mAddr;
ConnectionOrientedSocketIO* mCOSocketIO;
};
ListenSocketIO::ListenSocketIO(MessageLoop* mIOLoop,
ListenSocket* aListenSocket,
UnixSocketConnector* aConnector)
UnixSocketConnector* aConnector,
const nsACString& aAddress)
: UnixSocketWatcher(mIOLoop)
, SocketIOBase()
, mListenSocket(aListenSocket)
, mConnector(aConnector)
, mShuttingDownOnIOThread(false)
, mAddressLength(0)
, mAddress(aAddress)
, mCOSocketIO(nullptr)
{
MOZ_ASSERT(mListenSocket);
@@ -122,16 +132,7 @@ ListenSocketIO::GetSocketAddr(nsAString& aAddrStr) const
aAddrStr.Truncate();
return;
}
nsCString addressString;
nsresult rv = mConnector->ConvertAddressToString(
*reinterpret_cast<const struct sockaddr*>(&mAddress), mAddressLength,
addressString);
if (NS_FAILED(rv)) {
return;
}
aAddrStr.Assign(NS_ConvertUTF8toUTF16(addressString));
mConnector->GetSocketAddr(mAddr, aAddrStr);
}
void
@@ -141,14 +142,28 @@ ListenSocketIO::Listen(ConnectionOrientedSocketIO* aCOSocketIO)
MOZ_ASSERT(mConnector);
MOZ_ASSERT(aCOSocketIO);
struct sockaddr* address = reinterpret_cast<struct sockaddr*>(&mAddress);
mAddressLength = sizeof(mAddress);
if (!IsOpen()) {
int fd;
nsresult rv = mConnector->CreateListenSocket(address, &mAddressLength,
fd);
if (NS_FAILED(rv)) {
int fd = mConnector->Create();
if (fd < 0) {
NS_WARNING("Cannot create socket fd!");
FireSocketError();
return;
}
if (!SetSocketFlags(fd)) {
NS_WARNING("Cannot set socket flags!");
FireSocketError();
return;
}
if (!mConnector->SetUpListenSocket(GetFd())) {
NS_WARNING("Could not set up listen socket!");
FireSocketError();
return;
}
// This will set things we don't particularly care about, but
// it will hand back the correct structure size which is what
// we do care about.
if (!mConnector->CreateAddr(true, mAddrSize, mAddr, nullptr)) {
NS_WARNING("Cannot create socket address!");
FireSocketError();
return;
}
@@ -158,7 +173,8 @@ ListenSocketIO::Listen(ConnectionOrientedSocketIO* aCOSocketIO)
mCOSocketIO = aCOSocketIO;
// calls OnListening on success, or OnError otherwise
nsresult rv = UnixSocketWatcher::Listen(address, mAddressLength);
nsresult rv = UnixSocketWatcher::Listen(
reinterpret_cast<struct sockaddr*>(&mAddr), mAddrSize);
NS_WARN_IF(NS_FAILED(rv));
}
@@ -205,6 +221,41 @@ ListenSocketIO::FireSocketError()
new SocketIOEventRunnable(this, SocketIOEventRunnable::CONNECT_ERROR));
}
bool
ListenSocketIO::SetSocketFlags(int aFd)
{
static const int reuseaddr = 1;
// Set socket addr to be reused even if kernel is still waiting to close
int res = setsockopt(aFd, SOL_SOCKET, SO_REUSEADDR,
&reuseaddr, sizeof(reuseaddr));
if (res < 0) {
return false;
}
// Set close-on-exec bit.
int flags = TEMP_FAILURE_RETRY(fcntl(aFd, F_GETFD));
if (-1 == flags) {
return false;
}
flags |= FD_CLOEXEC;
if (-1 == TEMP_FAILURE_RETRY(fcntl(aFd, F_SETFD, flags))) {
return false;
}
// Set non-blocking status flag.
flags = TEMP_FAILURE_RETRY(fcntl(aFd, F_GETFL));
if (-1 == flags) {
return false;
}
flags |= O_NONBLOCK;
if (-1 == TEMP_FAILURE_RETRY(fcntl(aFd, F_SETFL, flags))) {
return false;
}
return true;
}
void
ListenSocketIO::OnSocketCanAcceptWithoutBlocking()
{
@@ -212,24 +263,20 @@ ListenSocketIO::OnSocketCanAcceptWithoutBlocking()
MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_LISTENING);
MOZ_ASSERT(mCOSocketIO);
RemoveWatchers(READ_WATCHER|WRITE_WATCHER);
struct sockaddr_storage storage;
socklen_t addressLength = sizeof(storage);
int fd;
nsresult rv = mConnector->AcceptStreamSocket(
GetFd(),
reinterpret_cast<struct sockaddr*>(&storage), &addressLength,
fd);
if (NS_FAILED(rv)) {
FireSocketError();
struct sockaddr_storage addr;
socklen_t addrLen = sizeof(addr);
int fd = TEMP_FAILURE_RETRY(accept(GetFd(),
reinterpret_cast<struct sockaddr*>(&addr), &addrLen));
if (fd < 0) {
OnError("accept", errno);
return;
}
RemoveWatchers(READ_WATCHER|WRITE_WATCHER);
mCOSocketIO->Accept(fd,
reinterpret_cast<union sockaddr_any*>(&storage),
addressLength);
reinterpret_cast<union sockaddr_any*>(&addr),
addrLen);
}
// |SocketIOBase|
@@ -350,7 +397,8 @@ ListenSocket::Listen(UnixSocketConnector* aConnector,
return false;
}
mIO = new ListenSocketIO(XRE_GetIOMessageLoop(), this, connector.forget());
mIO = new ListenSocketIO(
XRE_GetIOMessageLoop(), this, connector.forget(), EmptyCString());
// Prepared I/O object, now start listening.
return Listen(aCOSocket);

View File

@@ -30,11 +30,13 @@ public:
StreamSocketIO(MessageLoop* mIOLoop,
StreamSocket* aStreamSocket,
UnixSocketConnector* aConnector);
UnixSocketConnector* aConnector,
const nsACString& aAddress);
StreamSocketIO(MessageLoop* mIOLoop, int aFd,
ConnectionStatus aConnectionStatus,
StreamSocket* aStreamSocket,
UnixSocketConnector* aConnector);
UnixSocketConnector* aConnector,
const nsACString& aAddress);
~StreamSocketIO();
void GetSocketAddr(nsAString& aAddrStr) const;
@@ -96,6 +98,9 @@ public:
private:
void FireSocketError();
// Set up flags on file descriptor.
static bool SetSocketFlags(int aFd);
/**
* Consumer pointer. Non-thread safe RefPtr, so should only be manipulated
* directly from main thread. All non-main-thread accesses should happen with
@@ -114,14 +119,19 @@ private:
bool mShuttingDownOnIOThread;
/**
* Number of valid bytes in |mAddress|
* Address we are connecting to, assuming we are creating a client connection.
*/
socklen_t mAddressLength;
nsCString mAddress;
/**
* Address structure of the socket currently in use
* Size of the socket address struct
*/
struct sockaddr_storage mAddress;
socklen_t mAddrSize;
/**
* Address struct of the socket currently in use
*/
sockaddr_any mAddr;
/**
* Task member for delayed connect task. Should only be access on main thread.
@@ -136,12 +146,13 @@ private:
StreamSocketIO::StreamSocketIO(MessageLoop* mIOLoop,
StreamSocket* aStreamSocket,
UnixSocketConnector* aConnector)
UnixSocketConnector* aConnector,
const nsACString& aAddress)
: UnixSocketWatcher(mIOLoop)
, mStreamSocket(aStreamSocket)
, mConnector(aConnector)
, mShuttingDownOnIOThread(false)
, mAddressLength(0)
, mAddress(aAddress)
, mDelayedConnectTask(nullptr)
{
MOZ_ASSERT(mStreamSocket);
@@ -151,12 +162,13 @@ StreamSocketIO::StreamSocketIO(MessageLoop* mIOLoop,
StreamSocketIO::StreamSocketIO(MessageLoop* mIOLoop, int aFd,
ConnectionStatus aConnectionStatus,
StreamSocket* aStreamSocket,
UnixSocketConnector* aConnector)
UnixSocketConnector* aConnector,
const nsACString& aAddress)
: UnixSocketWatcher(mIOLoop, aFd, aConnectionStatus)
, mStreamSocket(aStreamSocket)
, mConnector(aConnector)
, mShuttingDownOnIOThread(false)
, mAddressLength(0)
, mAddress(aAddress)
, mDelayedConnectTask(nullptr)
{
MOZ_ASSERT(mStreamSocket);
@@ -177,16 +189,7 @@ StreamSocketIO::GetSocketAddr(nsAString& aAddrStr) const
aAddrStr.Truncate();
return;
}
nsCString addressString;
nsresult rv = mConnector->ConvertAddressToString(
*reinterpret_cast<const struct sockaddr*>(&mAddress), mAddressLength,
addressString);
if (NS_FAILED(rv)) {
return;
}
aAddrStr.Assign(NS_ConvertUTF8toUTF16(addressString));
mConnector->GetSocketAddr(mAddr, aAddrStr);
}
StreamSocket*
@@ -236,21 +239,34 @@ StreamSocketIO::Connect()
MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop());
MOZ_ASSERT(mConnector);
MOZ_ASSERT(!IsOpen());
struct sockaddr* address = reinterpret_cast<struct sockaddr*>(&mAddress);
mAddressLength = sizeof(mAddress);
int fd;
nsresult rv = mConnector->CreateStreamSocket(address, &mAddressLength, fd);
if (NS_FAILED(rv)) {
FireSocketError();
return;
if (!IsOpen()) {
int fd = mConnector->Create();
if (fd < 0) {
NS_WARNING("Cannot create socket fd!");
FireSocketError();
return;
}
if (!SetSocketFlags(fd)) {
NS_WARNING("Cannot set socket flags!");
FireSocketError();
return;
}
if (!mConnector->SetUp(GetFd())) {
NS_WARNING("Could not set up socket!");
FireSocketError();
return;
}
if (!mConnector->CreateAddr(false, mAddrSize, mAddr, mAddress.get())) {
NS_WARNING("Cannot create socket address!");
FireSocketError();
return;
}
SetFd(fd);
}
SetFd(fd);
// calls OnConnected() on success, or OnError() otherwise
rv = UnixSocketWatcher::Connect(address, mAddressLength);
nsresult rv = UnixSocketWatcher::Connect(
reinterpret_cast<struct sockaddr*>(&mAddr), mAddrSize);
NS_WARN_IF(NS_FAILED(rv));
}
@@ -338,6 +354,41 @@ StreamSocketIO::FireSocketError()
new SocketIOEventRunnable(this, SocketIOEventRunnable::CONNECT_ERROR));
}
bool
StreamSocketIO::SetSocketFlags(int aFd)
{
static const int reuseaddr = 1;
// Set socket addr to be reused even if kernel is still waiting to close
int res = setsockopt(aFd, SOL_SOCKET, SO_REUSEADDR,
&reuseaddr, sizeof(reuseaddr));
if (res < 0) {
return false;
}
// Set close-on-exec bit.
int flags = TEMP_FAILURE_RETRY(fcntl(aFd, F_GETFD));
if (-1 == flags) {
return false;
}
flags |= FD_CLOEXEC;
if (-1 == TEMP_FAILURE_RETRY(fcntl(aFd, F_SETFD, flags))) {
return false;
}
// Set non-blocking status flag.
flags = TEMP_FAILURE_RETRY(fcntl(aFd, F_GETFL));
if (-1 == flags) {
return false;
}
flags |= O_NONBLOCK;
if (-1 == TEMP_FAILURE_RETRY(fcntl(aFd, F_SETFL, flags))) {
return false;
}
return true;
}
// |ConnectionOrientedSocketIO|
nsresult
@@ -347,11 +398,21 @@ StreamSocketIO::Accept(int aFd,
MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop());
MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_CONNECTING);
// File-descriptor setup
if (!SetSocketFlags(aFd)) {
return NS_ERROR_FAILURE;
}
if (!mConnector->SetUp(aFd)) {
NS_WARNING("Could not set up socket!");
return NS_ERROR_FAILURE;
}
SetSocket(aFd, SOCKET_IS_CONNECTED);
// Address setup
mAddressLength = aAddrLen;
memcpy(&mAddress, aAddr, mAddressLength);
memcpy(&mAddr, aAddr, aAddrLen);
mAddrSize = aAddrLen;
// Signal success
NS_DispatchToMainThread(
@@ -591,8 +652,9 @@ StreamSocket::Connect(UnixSocketConnector* aConnector,
return false;
}
nsCString addr(aAddress);
MessageLoop* ioLoop = XRE_GetIOMessageLoop();
mIO = new StreamSocketIO(ioLoop, this, connector.forget());
mIO = new StreamSocketIO(ioLoop, this, connector.forget(), addr);
SetConnectionStatus(SOCKET_CONNECTING);
if (aDelayMs > 0) {
StreamSocketIO::DelayedConnectTask* connectTask =
@@ -619,7 +681,7 @@ StreamSocket::PrepareAccept(UnixSocketConnector* aConnector)
mIO = new StreamSocketIO(XRE_GetIOMessageLoop(),
-1, UnixSocketWatcher::SOCKET_IS_CONNECTING,
this, connector.forget());
this, connector.forget(), EmptyCString());
return mIO;
}

View File

@@ -5,20 +5,12 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "UnixSocketConnector.h"
#include "nsISupportsImpl.h" // For MOZ_COUNT_CTOR, MOZ_COUNT_DTOR
namespace mozilla {
namespace ipc {
UnixSocketConnector::UnixSocketConnector()
{
MOZ_COUNT_CTOR(UnixSocketConnector);
}
UnixSocketConnector::~UnixSocketConnector()
{
MOZ_COUNT_DTOR(UnixSocketConnector);
}
{ }
}
}

View File

@@ -7,7 +7,6 @@
#ifndef mozilla_ipc_unixsocketconnector_h
#define mozilla_ipc_unixsocketconnector_h
#include <sys/socket.h>
#include "mozilla/ipc/UnixSocketWatcher.h"
#include "nsString.h"
@@ -17,7 +16,7 @@ namespace ipc {
/**
* |UnixSocketConnector| defines the socket creation and connection/listening
* functions for |UnixSocketConsumer|, et al. Due to the fact that socket setup
* can vary between protocols (Unix sockets, TCP sockets, Bluetooth sockets, etc),
* can vary between protocols (unix sockets, tcp sockets, bluetooth sockets, etc),
* this allows the user to create whatever connection mechanism they need while
* still depending on libevent for non-blocking communication handling.
*/
@@ -27,57 +26,57 @@ public:
virtual ~UnixSocketConnector();
/**
* Converts an address to a human-readable string.
* Establishs a file descriptor for a socket.
*
* @param aAddress A socket address
* @param aAddressLength The number of valid bytes in |aAddress|
* @param[out] aAddressString The resulting string
* @return NS_OK on success, or an XPCOM error code otherwise.
* @return File descriptor for socket
*/
virtual nsresult ConvertAddressToString(const struct sockaddr& aAddress,
socklen_t aAddressLength,
nsACString& aAddressString) = 0;
virtual int Create() = 0;
/**
* Creates a listening socket. I/O thread only.
* Since most socket specifics are related to address formation into a
* sockaddr struct, this function is defined by subclasses and fills in the
* structure as needed for whatever connection it is trying to build
*
* @param[out] aAddress The listening socket's address
* @param[out] aAddressLength The number of valid bytes in |aAddress|
* @param[out] aListenFd The socket's file descriptor
* @return NS_OK on success, or an XPCOM error code otherwise.
* @param aIsServer True is we are acting as a server socket
* @param aAddrSize Size of the struct
* @param aAddr Struct to fill
* @param aAddress If aIsServer is false, Address to connect to. nullptr otherwise.
*
* @return True if address is filled correctly, false otherwise
*/
virtual nsresult CreateListenSocket(struct sockaddr* aAddress,
socklen_t* aAddressLength,
int& aListenFd) = 0;
virtual bool CreateAddr(bool aIsServer,
socklen_t& aAddrSize,
sockaddr_any& aAddr,
const char* aAddress) = 0;
/**
* Accepts a stream socket from a listening socket. I/O thread only.
* Does any socket type specific setup that may be needed, only for socket
* created by ConnectSocket()
*
* @param aListenFd The listening socket
* @param[out] aAddress Returns the stream socket's address
* @param[out] aAddressLength Returns the number of valid bytes in |aAddress|
* @param[out] aStreamFd The stream socket's file descriptor
* @return NS_OK on success, or an XPCOM error code otherwise.
* @param aFd File descriptor for opened socket
*
* @return true is successful, false otherwise
*/
virtual nsresult AcceptStreamSocket(int aListenFd,
struct sockaddr* aAddress,
socklen_t* aAddressLen,
int& aStreamFd) = 0;
virtual bool SetUp(int aFd) = 0;
/**
* Creates a stream socket. I/O thread only.
* Perform socket setup for socket created by ListenSocket(), after listen().
*
* @param[in|out] aAddress The stream socket's address
* @param[in|out] aAddressLength The number of valid bytes in |aAddress|
* @param[out] aStreamFd The socket's file descriptor
* @return NS_OK on success, or an XPCOM error code otherwise.
* @param aFd File descriptor for opened socket
*
* @return true is successful, false otherwise
*/
virtual nsresult CreateStreamSocket(struct sockaddr* aAddress,
socklen_t* aAddressLength,
int& aStreamFd) = 0;
virtual bool SetUpListenSocket(int aFd) = 0;
protected:
UnixSocketConnector();
/**
* Get address of socket we're currently connected to. Return null string if
* not connected.
*
* @param aAddr Address struct
* @param aAddrStr String to store address to
*/
virtual void GetSocketAddr(const sockaddr_any& aAddr,
nsAString& aAddrStr) = 0;
};
}