summaryrefslogtreecommitdiffstats
path: root/xpcom/build/Services.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xpcom/build/Services.cpp')
-rw-r--r--xpcom/build/Services.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/xpcom/build/Services.cpp b/xpcom/build/Services.cpp
new file mode 100644
index 000000000..6c521391e
--- /dev/null
+++ b/xpcom/build/Services.cpp
@@ -0,0 +1,71 @@
+/* -*- 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/. */
+
+#include "mozilla/Likely.h"
+#include "mozilla/Services.h"
+#include "nsComponentManager.h"
+#include "nsIObserverService.h"
+#include "nsNetCID.h"
+#include "nsObserverService.h"
+#include "nsXPCOMPrivate.h"
+#include "nsIIOService.h"
+#include "nsIDirectoryService.h"
+#include "nsIChromeRegistry.h"
+#include "nsIStringBundle.h"
+#include "nsIToolkitChromeRegistry.h"
+#include "nsIXULOverlayProvider.h"
+#include "IHistory.h"
+#include "nsIXPConnect.h"
+#include "inIDOMUtils.h"
+#include "nsIPermissionManager.h"
+#include "nsIServiceWorkerManager.h"
+#include "nsIAsyncShutdown.h"
+#include "nsIUUIDGenerator.h"
+#include "nsIGfxInfo.h"
+
+using namespace mozilla;
+using namespace mozilla::services;
+
+/*
+ * Define a global variable and a getter for every service in ServiceList.
+ * eg. gIOService and GetIOService()
+ */
+#define MOZ_SERVICE(NAME, TYPE, CONTRACT_ID) \
+ static TYPE* g##NAME = nullptr; \
+ \
+ already_AddRefed<TYPE> \
+ mozilla::services::Get##NAME() \
+ { \
+ if (MOZ_UNLIKELY(gXPCOMShuttingDown)) { \
+ return nullptr; \
+ } \
+ if (!g##NAME) { \
+ nsCOMPtr<TYPE> os = do_GetService(CONTRACT_ID); \
+ os.swap(g##NAME); \
+ } \
+ nsCOMPtr<TYPE> ret = g##NAME; \
+ return ret.forget(); \
+ } \
+ NS_EXPORT_(already_AddRefed<TYPE>) \
+ mozilla::services::_external_Get##NAME() \
+ { \
+ return Get##NAME(); \
+ }
+
+#include "ServiceList.h"
+#undef MOZ_SERVICE
+
+/**
+ * Clears service cache, sets gXPCOMShuttingDown
+ */
+void
+mozilla::services::Shutdown()
+{
+ gXPCOMShuttingDown = true;
+#define MOZ_SERVICE(NAME, TYPE, CONTRACT_ID) NS_IF_RELEASE(g##NAME);
+#include "ServiceList.h"
+#undef MOZ_SERVICE
+}