mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Backed out changeset 3aa492e39918 (bug 827749) for failing all tests OS X.
This commit is contained in:
parent
d09dfff50c
commit
acdf155896
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user