Backed out changeset 3aa492e39918 (bug 827749) for failing all tests OS X.

This commit is contained in:
Jared Wein 2013-01-10 14:15:25 -05:00
parent d09dfff50c
commit acdf155896
2 changed files with 31 additions and 139 deletions

View File

@ -8,111 +8,58 @@
#include "nsDebug.h"
#ifdef XP_WIN
#include <windows.h>
#define INVALID_HANDLE INVALID_HANDLE_VALUE
#else // XP_WIN
#else
#include <unistd.h>
#ifndef OS_POSIX
#define OS_POSIX
#endif
#include "base/eintr_wrapper.h"
#define INVALID_HANDLE -1
#endif // XP_WIN
#endif
using mozilla::ipc::FileDescriptor;
FileDescriptor::FileDescriptor()
: mHandle(INVALID_HANDLE), mHandleCreatedByOtherProcess(false),
mHandleCreatedByOtherProcessWasUsed(false)
: mHandle(INVALID_HANDLE)
{ }
FileDescriptor::FileDescriptor(PlatformHandleType aHandle)
: mHandle(INVALID_HANDLE), mHandleCreatedByOtherProcess(false),
mHandleCreatedByOtherProcessWasUsed(false)
{
DuplicateInCurrentProcess(aHandle);
}
void
FileDescriptor::DuplicateInCurrentProcess(PlatformHandleType aHandle)
{
MOZ_ASSERT(!mHandleCreatedByOtherProcess);
if (IsValid(aHandle)) {
PlatformHandleType newHandle;
#ifdef XP_WIN
if (DuplicateHandle(GetCurrentProcess(), aHandle, GetCurrentProcess(),
&newHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
#else // XP_WIN
if ((newHandle = dup(aHandle)) != INVALID_HANDLE) {
#endif
mHandle = newHandle;
return;
}
NS_WARNING("Failed to duplicate file descriptor!");
}
mHandle = INVALID_HANDLE;
}
void
FileDescriptor::CloseCurrentProcessHandle()
{
MOZ_ASSERT_IF(mHandleCreatedByOtherProcess,
mHandleCreatedByOtherProcessWasUsed);
// Don't actually close handles created by another process.
if (mHandleCreatedByOtherProcess) {
return;
}
if (IsValid()) {
#ifdef XP_WIN
if (!CloseHandle(mHandle)) {
NS_WARNING("Failed to close file handle!");
}
#else // XP_WIN
HANDLE_EINTR(close(mHandle));
#endif
mHandle = INVALID_HANDLE;
}
}
FileDescriptor::PickleType
FileDescriptor::ShareTo(const FileDescriptor::IPDLPrivate&,
FileDescriptor::ProcessHandle aOtherProcess) const
{
PlatformHandleType newHandle;
#ifdef XP_WIN
if (IsValid()) {
if (DuplicateHandle(GetCurrentProcess(), mHandle, aOtherProcess,
&newHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
return newHandle;
}
if (mHandle == INVALID_HANDLE) {
return INVALID_HANDLE;
}
PlatformHandleType newHandle;
if (!DuplicateHandle(GetCurrentProcess(), mHandle, aOtherProcess, &newHandle,
0, FALSE, DUPLICATE_SAME_ACCESS)) {
NS_WARNING("Failed to duplicate file handle!");
return INVALID_HANDLE;
}
return INVALID_HANDLE;
return newHandle;
#else // XP_WIN
if (IsValid()) {
newHandle = dup(mHandle);
return base::FileDescriptor(newHandle, /* auto_close */ true);
if (mHandle == INVALID_HANDLE) {
return base::FileDescriptor();
}
return base::FileDescriptor();
PlatformHandleType newHandle = dup(mHandle);
if (newHandle < 0) {
NS_WARNING("Failed to duplicate file descriptor!");
return base::FileDescriptor();
}
// This file descriptor must be closed once the caller is done using it, so
// pass true here for the 'auto_close' argument.
return base::FileDescriptor(newHandle, true);
#endif
MOZ_NOT_REACHED("Must not get here!");
return PickleType();
}
// static
bool
FileDescriptor::IsValid(PlatformHandleType aHandle)
FileDescriptor::IsValid() const
{
return aHandle != INVALID_HANDLE;
return mHandle != INVALID_HANDLE;
}

View File

@ -7,7 +7,6 @@
#include "base/basictypes.h"
#include "base/process.h"
#include "mozilla/DebugOnly.h"
#include "nscore.h"
#ifdef XP_WIN
@ -51,12 +50,9 @@ public:
FileDescriptor();
FileDescriptor(const FileDescriptor& aOther)
{
*this = aOther;
}
FileDescriptor(PlatformHandleType aHandle);
FileDescriptor(PlatformHandleType aHandle)
: mHandle(aHandle)
{ }
FileDescriptor(const IPDLPrivate&, const PickleType& aPickle)
#ifdef XP_WIN
@ -64,34 +60,8 @@ public:
#else
: mHandle(aPickle.fd)
#endif
, mHandleCreatedByOtherProcess(true)
, mHandleCreatedByOtherProcessWasUsed(false)
{ }
~FileDescriptor()
{
CloseCurrentProcessHandle();
}
FileDescriptor&
operator=(const FileDescriptor& aOther)
{
CloseCurrentProcessHandle();
if (aOther.mHandleCreatedByOtherProcess) {
mHandleCreatedByOtherProcess = true;
mHandleCreatedByOtherProcessWasUsed =
aOther.mHandleCreatedByOtherProcessWasUsed;
mHandle = aOther.PlatformHandle();
} else {
DuplicateInCurrentProcess(aOther.PlatformHandle());
mHandleCreatedByOtherProcess = false;
mHandleCreatedByOtherProcessWasUsed = false;
}
return *this;
}
// Performs platform-specific actions to duplicate mHandle in the other
// process (e.g. dup() on POSIX, DuplicateHandle() on Windows). Returns a
// pickled value that can be passed to the other process via IPC.
@ -101,17 +71,11 @@ public:
// Tests mHandle against a well-known invalid platform-specific file handle
// (e.g. -1 on POSIX, INVALID_HANDLE_VALUE on Windows).
bool
IsValid() const
{
return IsValid(mHandle);
}
IsValid() const;
PlatformHandleType
PlatformHandle() const
{
if (mHandleCreatedByOtherProcess) {
mHandleCreatedByOtherProcessWasUsed = true;
}
return mHandle;
}
@ -122,26 +86,7 @@ public:
}
private:
static bool
IsValid(PlatformHandleType aHandle);
void
DuplicateInCurrentProcess(PlatformHandleType aHandle);
void
CloseCurrentProcessHandle();
PlatformHandleType mHandle;
// If this is true then this instance is created by IPDL to ferry a handle to
// its eventual consumer and we never close the handle. If this is false then
// we are a RAII wrapper around the handle and we close the handle on
// destruction.
bool mHandleCreatedByOtherProcess;
// This is to ensure that we don't leak the handle (which is only possible
// when we're in the receiving process).
mutable DebugOnly<bool> mHandleCreatedByOtherProcessWasUsed;
};
} // namespace ipc