Bug 1261107: Add IsCurrentThreadMTA() to ipc/mscom/Utils; r?jimm draft
authorAaron Klotz <aklotz@mozilla.com>
Mon, 18 Jul 2016 13:47:34 -0600
changeset 393328 beab91b75b27e37b0fe0c6d12b4c51ae337e85e6
parent 393304 fef429fba4c64c5b9c0c823a6ab713edbbcd4220
child 393329 36b47a0860c3b25302fc01b66427fd6d46c0d89c
push id24288
push useraklotz@mozilla.com
push dateWed, 27 Jul 2016 18:11:49 +0000
reviewersjimm
bugs1261107
milestone50.0a1
Bug 1261107: Add IsCurrentThreadMTA() to ipc/mscom/Utils; r?jimm MozReview-Commit-ID: 3ezKIAmvZZM
ipc/mscom/Utils.cpp
ipc/mscom/Utils.h
ipc/mscom/moz.build
--- 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'