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

Unified Diff: third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md

Issue 1935943002: Document registration of Oilpan weak callbacks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mention weak callbacks vs finalization Created 4 years, 8 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md
diff --git a/third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md b/third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md
index e946a057c70b76307c322a127e96ca92424a2477..21a150b6185ff2264fcfc1838c833ddd264be5bc 100644
--- a/third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md
+++ b/third_party/WebKit/Source/platform/heap/BlinkGCAPIReference.md
@@ -335,8 +335,10 @@ Specifically, if your class needs a tracing method, you need to:
The function implementation must contain:
* For each on-heap object `m_object` in your class, a tracing call: "```visitor->trace(m_object);```".
+* If your class has one or more weak references (`WeakMember<T>`), you have the option of
+ registering a *weak callback* for the object. See details below for how.
* For each base class of your class `BaseClass` that is a descendant of `GarbageCollected<T>` or
- `GarbageCollectedMixin`, delegation call to base class: "```BaseClass::trace(visitor);```"
+ `GarbageCollectedMixin`, a delegation call to base class: "```BaseClass::trace(visitor);```"
It is recommended that the delegation call, if any, is put at the end of a tracing method.
@@ -382,4 +384,43 @@ DEFINE_TRACE(C)
}
```
+Given that the class `C` above contained a `WeakMember<Y>` field, you could alternatively
+register a *weak callback* in the trace method, and have it be invoked after the marking
+phase:
+
+```c++
+
+void C::clearWeakMembers(Visitor* visitor)
+{
+ if (ThreadHeap::isHeapObjectAlive(m_y))
+ return;
+
+ // |m_y| is not referred to by anyone else, clear the weak
+ // reference along with updating state / clearing any other
+ // resources at the same time. None of those operations are
+ // allowed to perform heap allocations:
+ m_y->detach();
+
+ // Note: if the weak callback merely clears the weak reference,
+ // it is much simpler to just |trace| the field rather than
+ // install a custom weak callback.
+ m_y = nullptr;
+}
+
+DEFINE_TRACE(C)
+{
+ visitor->template registerWeakMembers<C, &C::clearWeakMembers>(this);
+ visitor->trace(m_x);
+ visitor->trace(m_z); // Heap collection does, too.
+ B::trace(visitor); // Delegate to the parent. In this case it's empty, but this is required.
+}
+```
+
+Please notice that if the object (of type `C`) is also not reachable, its `trace` method
+will not be invoked and any follow-on weak processing will not be done. Hence, if the
+object must always perform some operation when the weak reference is cleared, that
+needs to (also) happen during finalization.
+
+Weak callbacks have so far seen little use in Blink, but a mechanism that's available.
+
## Heap collections
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698