Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2142)

Unified Diff: Source/platform/Supplementable.h

Issue 178663004: Oilpan: move WorkerGlobalScope to oilpan's heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/RefCountedSupplement.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/Supplementable.h
diff --git a/Source/platform/Supplementable.h b/Source/platform/Supplementable.h
index 7d238da4040fdde9c212a643ea4e4c870e0a8d12..83e22f7b7376579367a02097233144aeecbe96e2 100644
--- a/Source/platform/Supplementable.h
+++ b/Source/platform/Supplementable.h
@@ -26,6 +26,7 @@
#ifndef Supplementable_h
#define Supplementable_h
+#include "heap/Handle.h"
#include "wtf/Assertions.h"
#include "wtf/HashMap.h"
#include "wtf/OwnPtr.h"
@@ -87,37 +88,70 @@ namespace WebCore {
// Note that reattachThread() does nothing if assertion is not enabled.
//
+template<typename T, bool isGarbageCollected>
+class SupplementBase;
+
+template<typename T, bool isGarbageCollected>
+class SupplementableBase;
+
+template<typename T, bool isGarbageCollected>
+struct SupplementableTraits;
+
template<typename T>
-class Supplementable;
+struct SupplementableTraits<T, true> {
+ typedef PassOwnPtrWillBeRawPtr<SupplementBase<T, true> > SupplementArgumentType;
+ typedef WillBeHeapHashMap<const char*, OwnPtrWillBeMember<SupplementBase<T, true> >, PtrHash<const char*> > SupplementMap;
+};
template<typename T>
-class Supplement {
+struct SupplementableTraits<T, false> {
+ typedef PassOwnPtr<SupplementBase<T, false> > SupplementArgumentType;
+ typedef HashMap<const char*, OwnPtr<SupplementBase<T, false> >, PtrHash<const char*> > SupplementMap;
+};
+
+template<bool>
+class SupplementTracing;
+
+template<>
+class SupplementTracing<true> : public GarbageCollectedMixin {
+public:
+ virtual void trace(Visitor*) = 0;
+};
+
+template<>
+class SupplementTracing<false> {
+public:
+ virtual void trace(Visitor*) { }
+};
+
+template<typename T, bool isGarbageCollected = false>
+class SupplementBase : public SupplementTracing<isGarbageCollected> {
public:
- virtual ~Supplement() { }
+ virtual ~SupplementBase() { }
#if SECURITY_ASSERT_ENABLED
virtual bool isRefCountedWrapper() const { return false; }
#endif
- static void provideTo(Supplementable<T>& host, const char* key, PassOwnPtr<Supplement<T> > supplement)
+ static void provideTo(SupplementableBase<T, isGarbageCollected>& host, const char* key, typename SupplementableTraits<T, isGarbageCollected>::SupplementArgumentType supplement)
{
host.provideSupplement(key, supplement);
}
- static Supplement<T>* from(Supplementable<T>& host, const char* key)
+ static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isGarbageCollected>& host, const char* key)
{
return host.requireSupplement(key);
}
- static Supplement<T>* from(Supplementable<T>* host, const char* key)
+ static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isGarbageCollected>* host, const char* key)
{
return host ? host->requireSupplement(key) : 0;
}
};
-template<typename T>
-class Supplementable {
+template<typename T, bool isGarbageCollected = false>
+class SupplementableBase {
public:
- void provideSupplement(const char* key, PassOwnPtr<Supplement<T> > supplement)
+ void provideSupplement(const char* key, typename SupplementableTraits<T, isGarbageCollected>::SupplementArgumentType supplement)
{
ASSERT(m_threadId == currentThread());
ASSERT(!m_supplements.get(key));
@@ -130,7 +164,7 @@ public:
m_supplements.remove(key);
}
- Supplement<T>* requireSupplement(const char* key)
+ SupplementBase<T, isGarbageCollected>* requireSupplement(const char* key)
{
ASSERT(m_threadId == currentThread());
return m_supplements.get(key);
@@ -143,19 +177,45 @@ public:
#endif
}
+ void trace(Visitor* visitor)
+ {
+ visitor->trace(m_supplements);
+ }
+
#if !ASSERT_DISABLED
protected:
- Supplementable() : m_threadId(currentThread()) { }
+ SupplementableBase() : m_threadId(currentThread()) { }
#endif
private:
- typedef HashMap<const char*, OwnPtr<Supplement<T> >, PtrHash<const char*> > SupplementMap;
- SupplementMap m_supplements;
+ typename SupplementableTraits<T, isGarbageCollected>::SupplementMap m_supplements;
#if !ASSERT_DISABLED
ThreadIdentifier m_threadId;
#endif
};
+template<typename T>
+class HeapSupplement : public SupplementBase<T, true> { };
+
+template<typename T>
+class HeapSupplementable : public SupplementableBase<T, true> { };
+
+template<typename T>
+class Supplement : public SupplementBase<T, false> { };
+
+template<typename T>
+class Supplementable : public SupplementableBase<T, false> { };
+
+template<typename T>
+struct ThreadingTrait<WebCore::SupplementBase<T, true> > {
+ static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
+};
+
+template<typename T>
+struct ThreadingTrait<WebCore::SupplementableBase<T, true> > {
+ static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
+};
+
} // namespace WebCore
#endif // Supplementable_h
« no previous file with comments | « Source/platform/RefCountedSupplement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698