/* -*- 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/. */
/** * This is a helper class that caches services that are registered in a certain * category. The intended usage is that a service stores a variable of type * nsCategoryCache<nsIFoo> in a member variable, where nsIFoo is the interface * that these services should implement. The constructor of this class should * then get the name of the category.
*/ template <class T> class nsCategoryCache final { public: explicit nsCategoryCache(constchar* aCategory) : mCategoryName(aCategory) {
MOZ_ASSERT(NS_IsMainThread());
}
~nsCategoryCache() {
MOZ_ASSERT(NS_IsMainThread()); if (mObserver) {
mObserver->ListenerDied();
}
}
/** * This function returns an nsCOMArray of interface pointers to the cached * category enries for the requested category. This was added in order to be * used in call sites where the overhead of excessive allocations can be * unacceptable. See bug 1360971 for an example.
*/ const nsCOMArray<T>& GetCachedEntries() {
MOZ_ASSERT(NS_IsMainThread());
LazyInit();
if (mCachedEntries.IsEmpty()) {
AddEntries(mCachedEntries);
} return mCachedEntries;
}
private: void LazyInit() { // Lazy initialization, so that services in this category can't // cause reentrant getService (bug 386376) if (!mObserver) {
mObserver = new nsCategoryObserver(mCategoryName);
mObserver->SetListener(nsCategoryCache<T>::OnCategoryChanged, this);
}
}
void AddEntries(nsCOMArray<T>& aResult) { for (nsISupports* entry : mObserver->GetHash().Values()) {
nsCOMPtr<T> service = do_QueryInterface(entry); if (service) {
aResult.AppendElement(service.forget());
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.