mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Backout f3b6bc4b2590 (Bug 827749) for test failures.
This commit is contained in:
parent
7e074eb410
commit
cc4d01a3b5
@ -8,93 +8,50 @@
|
||||
#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), mMustCloseHandle(false)
|
||||
: mHandle(INVALID_HANDLE)
|
||||
{ }
|
||||
|
||||
FileDescriptor::FileDescriptor(PlatformHandleType aHandle)
|
||||
: mHandle(INVALID_HANDLE), mMustCloseHandle(false)
|
||||
{
|
||||
DuplicateInCurrentProcess(aHandle);
|
||||
}
|
||||
|
||||
FileDescriptor::~FileDescriptor()
|
||||
{
|
||||
if (mMustCloseHandle) {
|
||||
MOZ_ASSERT(mHandle != INVALID_HANDLE);
|
||||
#ifdef XP_WIN
|
||||
if (!CloseHandle(mHandle)) {
|
||||
NS_WARNING("Failed to close file handle!");
|
||||
}
|
||||
#else // XP_WIN
|
||||
HANDLE_EINTR(close(mHandle));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FileDescriptor::DuplicateInCurrentProcess(PlatformHandleType aHandle)
|
||||
{
|
||||
if (aHandle != INVALID_HANDLE) {
|
||||
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;
|
||||
mMustCloseHandle = true;
|
||||
return;
|
||||
}
|
||||
NS_WARNING("Failed to duplicate file descriptor!");
|
||||
}
|
||||
|
||||
mHandle = INVALID_HANDLE;
|
||||
mMustCloseHandle = false;
|
||||
}
|
||||
|
||||
FileDescriptor::PickleType
|
||||
FileDescriptor::ShareTo(const FileDescriptor::IPDLPrivate&,
|
||||
FileDescriptor::ProcessHandle aOtherProcess) const
|
||||
{
|
||||
PlatformHandleType newHandle;
|
||||
#ifdef XP_WIN
|
||||
if (mHandle != INVALID_HANDLE) {
|
||||
if (DuplicateHandle(GetCurrentProcess(), mHandle, aOtherProcess,
|
||||
&newHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
|
||||
// mHandle must still be closed here (since it is an in-process handle
|
||||
// that we duplicated) so leave mMustCloseHandle unchanged.
|
||||
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 (mHandle != INVALID_HANDLE) {
|
||||
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!");
|
||||
|
@ -50,30 +50,18 @@ 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
|
||||
: mHandle(aPickle), mMustCloseHandle(false)
|
||||
: mHandle(aPickle)
|
||||
#else
|
||||
: mHandle(aPickle.fd), mMustCloseHandle(false)
|
||||
: mHandle(aPickle.fd)
|
||||
#endif
|
||||
{ }
|
||||
|
||||
~FileDescriptor();
|
||||
|
||||
FileDescriptor&
|
||||
operator=(const FileDescriptor& aOther)
|
||||
{
|
||||
DuplicateInCurrentProcess(aOther.mHandle);
|
||||
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.
|
||||
@ -98,11 +86,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
void
|
||||
DuplicateInCurrentProcess(PlatformHandleType aHandle);
|
||||
|
||||
PlatformHandleType mHandle;
|
||||
bool mMustCloseHandle;
|
||||
};
|
||||
|
||||
} // namespace ipc
|
||||
|
Loading…
Reference in New Issue
Block a user