Having this document as a reference will be great!

History
Many objects in WebKit are reference counted. The pattern used is that classes have member functionsref and deref that increment and decrement the reference count. Each call to ref has to be matched by a call to deref. When the reference count hits 0, the object is deleted. Many of these classes create new objects with a reference count of 0; this is referred to as the floating state. An object in floating state must have ref and then deref called on it before it will be deleted. Many classes in WebCore implement this by inheriting from the Shared class template.

"This" was ambiguous to me. I would say, "implement ref and deref" instead of "implement this."

The inspiration for a solution came from the C++ standard class template auto_ptr. These objects implement a model where assignment is transfer of ownership. When you assign from one auto_ptr to another, the donor becomes 0.

PassRefPtr is like RefPtr with a difference. When you copy a PassRefPtr or assign the value of aPassRefPtr to a RefPtr or another PassRefPtr, the original pointer value is set to 0; the operation is done without any change to the reference count. Let’s take a look at a new version of our example:

In the first paragraph, you use the term "donor." In the second paragraph, you use the term "original pointer value." I think "source" or "source pointer" would be good terms. Either way, you should pick something to use consistently.

I think it would be helpful to explain why the source pointer must become 0 -- i.e., "...the source pointer becomes 0, to prevent you from using an object whose lifetime you no longer control."
// example, not preferred style PassRefPtr<Node> createSpecialNode() { PassRefPtr<Node> a = new Node; a->setSpecial(true); return a; } RefPtr<Node> b = createSpecialNode(); The node object starts with a reference count of 0. When it’s assigned to a, the reference count is incremented to 1. Then a gets set to 0 when the return value PassRefPtr is created. Then the return value is set to 0 when b is created.

It might be helpful to explain why all of this local variable churn is OK, whereas reference count churn causes performance problems.
// some type casts RefPtr<DerivedNode> d = static_pointer_cast<DerivedNode>(a);

Since static_pointer_cast is a made up name, it's not like the other operators listed. You might want to annotate this line with a comment like, "type casts use a special function."

Most of the time, we'll end up referring new programmers to this document -- perhaps during a code review, or as an answer to a question on IRC. Given that audience, I think it might be best to begin the document with the "Guidelines" section, along with a pithy example of each use, and then end with the history and the "why." Understanding "why" is harder than just learning "how" and copying it.

Geoff
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to