Bug 1261107: Add IsCurrentThreadMTA() to ipc/mscom/Utils; r?jimm
MozReview-Commit-ID: 3ezKIAmvZZM
--- a/ipc/mscom/Utils.cpp
+++ b/ipc/mscom/Utils.cpp
@@ -1,23 +1,56 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=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/. */
+// We need Windows 7 headers
+#ifdef NTDDI_VERSION
+#undef NTDDI_VERSION
+#endif
+#define NTDDI_VERSION 0x06010000
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
+#define _WIN32_WINNT 0x0601
+
+#include "DynamicallyLinkedFunctionPtr.h"
#include "mozilla/mscom/Utils.h"
#include "mozilla/RefPtr.h"
#include <objidl.h>
namespace mozilla {
namespace mscom {
bool
+IsCurrentThreadMTA()
+{
+ static DynamicallyLinkedFunctionPtr<decltype(&::CoGetApartmentType)>
+ pCoGetApartmentType(L"ole32.dll", "CoGetApartmentType");
+
+ // There isn't really a thread-safe way to query this on Windows XP. In that
+ // case, we'll just return false since that assumption does no harm.
+ if (!pCoGetApartmentType) {
+ return false;
+ }
+
+ APTTYPE aptType;
+ APTTYPEQUALIFIER aptTypeQualifier;
+ HRESULT hr = pCoGetApartmentType(&aptType, &aptTypeQualifier);
+ if (FAILED(hr)) {
+ return false;
+ }
+
+ return aptType == APTTYPE_MTA;
+}
+
+bool
IsProxy(IUnknown* aUnknown)
{
if (!aUnknown) {
return false;
}
// Only proxies implement this interface, so if it is present then we must
// be dealing with a proxied object.
--- a/ipc/mscom/Utils.h
+++ b/ipc/mscom/Utils.h
@@ -7,15 +7,16 @@
#ifndef mozilla_mscom_Utils_h
#define mozilla_mscom_Utils_h
struct IUnknown;
namespace mozilla {
namespace mscom {
+bool IsCurrentThreadMTA();
bool IsProxy(IUnknown* aUnknown);
} // namespace mscom
} // namespace mozilla
#endif // mozilla_mscom_Utils_h
--- a/ipc/mscom/moz.build
+++ b/ipc/mscom/moz.build
@@ -5,16 +5,19 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
EXPORTS.mozilla.mscom += [
'COMApartmentRegion.h',
'MainThreadRuntime.h',
'Utils.h',
]
+SOURCES += [
+ 'Utils.cpp',
+]
+
UNIFIED_SOURCES += [
'MainThreadRuntime.cpp',
- 'Utils.cpp',
]
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'xul'