fune/ipc/mscom/oop/Factory.h
Emilio Cobos Álvarez 256c124f94 Bug 1609996 - Reorder some includes affected by the previous patches. r=froydnj
This was done by:

This was done by applying:

```
diff --git a/python/mozbuild/mozbuild/code-analysis/mach_commands.py b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
index 789affde7bbf..fe33c4c7d4d1 100644
--- a/python/mozbuild/mozbuild/code-analysis/mach_commands.py
+++ b/python/mozbuild/mozbuild/code-analysis/mach_commands.py
@@ -2007,7 +2007,7 @@ class StaticAnalysis(MachCommandBase):
         from subprocess import Popen, PIPE, check_output, CalledProcessError

         diff_process = Popen(self._get_clang_format_diff_command(commit), stdout=PIPE)
-        args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format]
+        args = [sys.executable, clang_format_diff, "-p1", "-binary=%s" % clang_format, '-sort-includes']

         if not output_file:
             args.append("-i")
```

Then running `./mach clang-format -c <commit-hash>`

Then undoing that patch.

Then running check_spidermonkey_style.py --fixup

Then running `./mach clang-format`

I had to fix four things:

 * I needed to move <utility> back down in GuardObjects.h because I was hitting
   obscure problems with our system include wrappers like this:

0:03.94 /usr/include/stdlib.h:550:14: error: exception specification in declaration does not match previous declaration
0:03.94 extern void *realloc (void *__ptr, size_t __size)
0:03.94              ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/malloc_decls.h:53:1: note: previous declaration is here
0:03.94 MALLOC_DECL(realloc, void*, void*, size_t)
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozilla/mozalloc.h:22:32: note: expanded from macro 'MALLOC_DECL'
0:03.94     MOZ_MEMORY_API return_type name##_impl(__VA_ARGS__);
0:03.94                                ^
0:03.94 <scratch space>:178:1: note: expanded from here
0:03.94 realloc_impl
0:03.94 ^
0:03.94 /home/emilio/src/moz/gecko-2/obj-debug/dist/include/mozmemory_wrap.h:142:41: note: expanded from macro 'realloc_impl'
0:03.94 #define realloc_impl mozmem_malloc_impl(realloc)

   Which I really didn't feel like digging into.

 * I had to restore the order of TrustOverrideUtils.h and related files in nss
   because the .inc files depend on TrustOverrideUtils.h being included earlier.

 * I had to add a missing include to RollingNumber.h

 * Also had to partially restore include order in JsepSessionImpl.cpp to avoid
   some -WError issues due to some static inline functions being defined in a
   header but not used in the rest of the compilation unit.

Differential Revision: https://phabricator.services.mozilla.com/D60327

--HG--
extra : moz-landing-system : lando
2020-01-20 16:19:48 +00:00

142 lines
3.3 KiB
C++

/* -*- 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/. */
#ifndef mozilla_mscom_Factory_h
#define mozilla_mscom_Factory_h
#if defined(MOZILLA_INTERNAL_API)
# error This code is NOT for internal Gecko use!
#endif // defined(MOZILLA_INTERNAL_API)
#include <objbase.h>
#include <unknwn.h>
#include <utility>
#include "Module.h"
#include "mozilla/Attributes.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/RefPtr.h"
#include "mozilla/StaticPtr.h"
/* WARNING! The code in this file may be loaded into the address spaces of other
processes! It MUST NOT link against xul.dll or other Gecko binaries! Only
inline code may be included! */
namespace mozilla {
namespace mscom {
template <typename T>
class MOZ_NONHEAP_CLASS Factory : public IClassFactory {
template <typename... Args>
HRESULT DoCreate(Args&&... args) {
MOZ_DIAGNOSTIC_ASSERT(false, "This should not be executed");
return E_NOTIMPL;
}
template <typename... Args>
HRESULT DoCreate(HRESULT (*aFnPtr)(IUnknown*, REFIID, void**),
Args&&... args) {
return aFnPtr(std::forward<Args>(args)...);
}
public:
// IUnknown
STDMETHODIMP QueryInterface(REFIID aIid, void** aOutInterface) override {
if (!aOutInterface) {
return E_INVALIDARG;
}
if (aIid == IID_IUnknown || aIid == IID_IClassFactory) {
RefPtr<IClassFactory> punk(this);
punk.forget(aOutInterface);
return S_OK;
}
*aOutInterface = nullptr;
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) AddRef() override {
Module::Lock();
return 2;
}
STDMETHODIMP_(ULONG) Release() override {
Module::Unlock();
return 1;
}
// IClassFactory
STDMETHODIMP CreateInstance(IUnknown* aOuter, REFIID aIid,
void** aOutInterface) override {
return DoCreate(&T::Create, aOuter, aIid, aOutInterface);
}
STDMETHODIMP LockServer(BOOL aLock) override {
if (aLock) {
Module::Lock();
} else {
Module::Unlock();
}
return S_OK;
}
};
template <typename T>
class MOZ_NONHEAP_CLASS SingletonFactory : public Factory<T> {
public:
STDMETHODIMP CreateInstance(IUnknown* aOuter, REFIID aIid,
void** aOutInterface) override {
if (aOuter || !aOutInterface) {
return E_INVALIDARG;
}
RefPtr<T> obj(sInstance);
if (!obj) {
obj = GetOrCreateSingleton();
}
return obj->QueryInterface(aIid, aOutInterface);
}
RefPtr<T> GetOrCreateSingleton() {
if (!sInstance) {
RefPtr<T> object;
if (FAILED(T::Create(getter_AddRefs(object)))) {
return nullptr;
}
sInstance = object.forget();
}
return sInstance;
}
RefPtr<T> GetSingleton() { return sInstance; }
void ClearSingleton() {
if (!sInstance) {
return;
}
DebugOnly<HRESULT> hr = ::CoDisconnectObject(sInstance.get(), 0);
MOZ_ASSERT(SUCCEEDED(hr));
sInstance = nullptr;
}
private:
static StaticRefPtr<T> sInstance;
};
template <typename T>
StaticRefPtr<T> SingletonFactory<T>::sInstance;
} // namespace mscom
} // namespace mozilla
#endif // mozilla_mscom_Factory_h