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

Unified Diff: public/platform/WebPrivateHeapPtr.h

Issue 169343002: [WIP]Add WebPrivateHeapPtr and use it for speech platform layer. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 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
Index: public/platform/WebPrivateHeapPtr.h
diff --git a/public/platform/WebPrivateHeapPtr.h b/public/platform/WebPrivateHeapPtr.h
new file mode 100644
index 0000000000000000000000000000000000000000..bfd246b3947579f6ef875275f5120e5e32dfa5d3
--- /dev/null
+++ b/public/platform/WebPrivateHeapPtr.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2014, Opera Software ASA. All rights reserved.
haraken 2014/02/17 09:04:57 Can you use the 4-line copyright?
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Opera Software ASA nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebPrivateHeapPtr_h
+#define WebPrivateHeapPtr_h
+
+#include "WebCommon.h"
+
+#if INSIDE_BLINK
haraken 2014/02/17 09:04:57 What's the difference between INSIDE_BLINK and BLI
sof 2014/02/17 10:22:26 Good question; I can't discern a pattern within th
tkent 2014/02/17 23:42:46 INSIDE_BLINK means that it's in either of webkit.d
sof 2014/02/18 10:14:17 Excellent clarification & info, many thanks :) On
+#include "heap/Handle.h"
+#include "wtf/PassRefPtr.h"
+#endif
+
+namespace blink {
+
+// A version of WebPrivatePtr that holds a heap-residing object,
+// but without exposing how that is done within Blink. If no
+// heap support (i.e., no Oilpan), WebPrivateHeapPtr is equal
+// to WebPrivatePtr and the object will be reference counted.
haraken 2014/02/17 09:04:57 "heap" is ambiguous. We want to use "garbage-colle
+//
+// See WebPrivatePtr.h comment for how to make use of WebPrivateHeapPtr;
+// same pattern applies, but for one detail. Instead of declaring & defining,
+//
+// #if INSIDE_BLINK
+// WebFoo(const WTF::PassRefPtr<WebCore::Foo>&);
+// #endif
+//
+// provide
+//
+// #if INSIDE_BLINK
+// WebFoo(const WTF::PassRefPtrWillBeRawPtr<WebCore::Foo>&);
+// #endif
+//
+template <typename T>
+class WebPrivateHeapPtr {
+public:
+ WebPrivateHeapPtr() : m_ptr(0) { }
+ ~WebPrivateHeapPtr()
+ {
+ // We don't destruct the object pointed by m_ptr here because we don't
+ // want to expose destructors of core classes to embedders. We should
+ // call reset() manually in destructors of classes with WebPrivateHeapPtr
+ // members.
+ BLINK_ASSERT(!m_ptr);
+ }
+
+ bool isNull() const { return !m_ptr; }
+
+#if INSIDE_BLINK
+ WebPrivateHeapPtr(const PassRefPtrWillBeRawPtr<T>& p)
+# if !ENABLE(OILPAN)
+ : m_ptr(p.leakRef())
+# endif
+ {
+# if ENABLE(OILPAN)
+ assign(new WebCore::Persistent<T>(p));
haraken 2014/02/17 09:04:57 How about calling 'new Persistent' in assign? assi
sof 2014/02/17 09:23:21 Yes, let's do that.
+# endif
+ }
+
+ void reset()
+ {
+# if ENABLE(OILPAN)
+ if (this->m_ptr) {
+ delete reinterpret_cast<WebCore::Persistent<T>*>(this->m_ptr);
+ this->m_ptr = 0;
+ }
+# else
+ assign(0);
+# endif
+ }
+
+ WebPrivateHeapPtr<T>& operator=(const WebPrivateHeapPtr<T>& other)
+ {
+# if ENABLE(OILPAN)
+ assign(new WebCore::Persistent<T>(other.get()));
+# else
+ T* p = other.m_ptr;
+ if (p)
+ p->ref();
+ assign(p);
+# endif
+ return *this;
+ }
+
+ WebPrivateHeapPtr<T>& operator=(WebPrivateHeapPtr<T>& other)
+ {
+ assign(new WebCore::Persistent<T>(other.get()));
+ return *this;
+ }
+
+ WebPrivateHeapPtr<T>& operator=(const PassRefPtrWillBeRawPtr<T>& p)
+ {
+# if ENABLE(OILPAN)
+ assign(new WebCore::Persistent<T>(p));
+# else
+ assign(p.leakRef());
+# endif
+ return *this;
+ }
+
+ T* get() const
+ {
+# if ENABLE(OILPAN)
+ if (!m_ptr)
+ return 0;
+ return (reinterpret_cast<WebCore::Persistent<T> * >(m_ptr))->get();
+# else
+ return m_ptr;
+# endif
+ }
+
+ T* operator->() const
+ {
+ ASSERT(m_ptr);
+# if ENABLE(OILPAN)
+ return (reinterpret_cast<WebCore::Persistent<T> * >(m_ptr))->get();
+# else
+ return m_ptr;
+# endif
+ }
+#endif
+
+private:
+#if INSIDE_BLINK
+# if ENABLE(OILPAN)
+ void assign(WebCore::Persistent<T>* p)
+ {
+ reset();
+ m_ptr = reinterpret_cast<T*>(p);
+ }
+# else
+ void assign(T* p)
+ {
+ // p is already ref'd for us by the caller
+ if (m_ptr)
+ m_ptr->deref();
+ m_ptr = p;
+ }
+# endif
+#else
+ // Disable the assignment operator; we define it above for when
+ // INSIDE_BLINK is set, but we need to make sure that it is not
+ // used outside there; the compiler-provided version won't handle reference
+ // counting properly.
+ WebPrivateHeapPtr<T>& operator=(const WebPrivateHeapPtr<T>& other);
+#endif
+ // Disable the copy constructor; classes that contain a WebPrivateHeapPtr
+ // should implement their copy constructor using assign().
+ WebPrivateHeapPtr(const WebPrivateHeapPtr<T>&);
+
+ T* m_ptr;
+};
+
+} // namespace blink
+
+#endif

Powered by Google App Engine
This is Rietveld 408576698