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

Unified Diff: skia/ext/refptr.h

Issue 15004024: Only use skia::RefPtr for refcounting (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment changes, SharePtr Created 7 years, 7 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 | « printing/pdf_metafile_skia.cc ('k') | ui/gfx/render_text.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: skia/ext/refptr.h
diff --git a/skia/ext/refptr.h b/skia/ext/refptr.h
index 514d453e034d69ccd10b96de8bb3a7f8666a93c0..a3900f61ba4502c0d59c3b8664cf6bb4dd3c4aa1 100644
--- a/skia/ext/refptr.h
+++ b/skia/ext/refptr.h
@@ -13,7 +13,7 @@ namespace skia {
// this class to avoid dealing with the ref-counting and prevent leaks/crashes
// due to ref-counting bugs.
//
-// Example of Creating an SkShader* and setting it on a SkPaint:
+// Example of creating a new SkShader* and setting it on a SkPaint:
// skia::RefPtr<SkShader> shader = skia::AdoptRef(SkGradientShader::Create());
// paint.setShader(shader.get());
//
@@ -25,12 +25,18 @@ namespace skia {
// }
// skia::RefPtr<SkShader> member_refptr_;
//
-// When returning a ref-counted ponter, also return the skia::RefPtr instead. An
-// example method that creates an SkShader* and returns it:
+// When returning a ref-counted pointer, also return the skia::RefPtr instead.
+// An example method that creates an SkShader* and returns it:
// skia::RefPtr<SkShader> MakeAShader() {
// return skia::AdoptRef(SkGradientShader::Create());
// }
//
+// To take a scoped reference to an object whose references are all owned
+// by other objects (i.e. does not have one that needs to be adopted) use the
+// skia::SharePtr helper:
+//
+// skia::RefPtr<SkShader> shader = skia::SharePtr(paint.getShader());
+//
// Never call ref() or unref() on the underlying ref-counted pointer. If you
// AdoptRef() the raw pointer immediately into a skia::RefPtr and always work
// with skia::RefPtr instances instead, the ref-counting will be taken care of
@@ -84,15 +90,29 @@ class RefPtr {
private:
T* ptr_;
+ // This function cannot be public because Skia starts its ref-counted
+ // objects at refcnt=1. This makes it impossible to differentiate
+ // between a newly created object (that doesn't need to be ref'd) or an
+ // already existing object with one owner (that does need to be ref'd so that
+ // this RefPtr can also manage its lifetime).
explicit RefPtr(T* ptr) : ptr_(ptr) {}
template<typename U>
friend RefPtr<U> AdoptRef(U* ptr);
+
+ template<typename U>
+ friend RefPtr<U> SharePtr(U* ptr);
};
+// For objects that have an unowned reference (such as newly created objects).
template<typename T>
RefPtr<T> AdoptRef(T* ptr) { return RefPtr<T>(ptr); }
+// For objects that are already owned. This doesn't take ownership of existing
+// references and adds a new one.
+template<typename T>
+RefPtr<T> SharePtr(T* ptr) { return RefPtr<T>(SkSafeRef(ptr)); }
+
} // namespace skia
#endif // SKIA_EXT_REFPTR_H_
« no previous file with comments | « printing/pdf_metafile_skia.cc ('k') | ui/gfx/render_text.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698