diff --git a/webrtc/api/statstypes.h b/webrtc/api/statstypes.h index 1a55145ab4..788c2c403f 100644 --- a/webrtc/api/statstypes.h +++ b/webrtc/api/statstypes.h @@ -22,7 +22,6 @@ #include "webrtc/base/basictypes.h" #include "webrtc/base/common.h" #include "webrtc/base/constructormagic.h" -#include "webrtc/base/linked_ptr.h" #include "webrtc/base/refcount.h" #include "webrtc/base/scoped_ref_ptr.h" #include "webrtc/base/stringencode.h" @@ -264,6 +263,22 @@ class StatsReport { ~Value(); + // Support ref counting. Note that for performance reasons, we + // don't use thread safe operations. Therefore, all operations + // affecting the ref count (in practice, creation and copying of + // the Values mapping) must occur on webrtc's signalling thread. + int AddRef() const { + RTC_DCHECK_RUN_ON(&thread_checker_); + return ++ref_count_; + } + int Release() const { + RTC_DCHECK_RUN_ON(&thread_checker_); + int count = --ref_count_; + if (!count) + delete this; + return count; + } + // TODO(tommi): This compares name as well as value... // I think we should only need to compare the value part and // move the name part into a hash map. @@ -304,6 +319,9 @@ class StatsReport { const StatsValueName name; private: + rtc::ThreadChecker thread_checker_; + mutable int ref_count_ ACCESS_ON(thread_checker_) = 0; + const Type type_; // TODO(tommi): Use C++ 11 union and make value_ const. union InternalType { @@ -316,13 +334,10 @@ class StatsReport { Id* id_; } value_; - private: RTC_DISALLOW_COPY_AND_ASSIGN(Value); }; - // TODO(tommi): Consider using a similar approach to how we store Ids using - // scoped_refptr for values. - typedef rtc::linked_ptr ValuePtr; + typedef rtc::scoped_refptr ValuePtr; typedef std::map Values; // Ownership of |id| is passed to |this|. diff --git a/webrtc/base/BUILD.gn b/webrtc/base/BUILD.gn index 0902581f2e..51882da0f9 100644 --- a/webrtc/base/BUILD.gn +++ b/webrtc/base/BUILD.gn @@ -424,7 +424,6 @@ rtc_static_library("rtc_base") { "httpcommon.h", "ipaddress.cc", "ipaddress.h", - "linked_ptr.h", "messagedigest.cc", "messagedigest.h", "messagehandler.cc", diff --git a/webrtc/base/cryptstring.h b/webrtc/base/cryptstring.h index adaac2f36b..e1ee309f65 100644 --- a/webrtc/base/cryptstring.h +++ b/webrtc/base/cryptstring.h @@ -17,8 +17,6 @@ #include #include -#include "webrtc/base/linked_ptr.h" - namespace rtc { class CryptStringImpl { diff --git a/webrtc/base/linked_ptr.h b/webrtc/base/linked_ptr.h deleted file mode 100644 index 65e5a00ecf..0000000000 --- a/webrtc/base/linked_ptr.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2004 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -/* - * linked_ptr - simple reference linked pointer - * (like reference counting, just using a linked list of the references - * instead of their count.) - * - * The implementation stores three pointers for every linked_ptr, but - * does not allocate anything on the free store. - */ - -#ifndef WEBRTC_BASE_LINKED_PTR_H__ -#define WEBRTC_BASE_LINKED_PTR_H__ - -namespace rtc { - -/* For ANSI-challenged compilers, you may want to #define - * NO_MEMBER_TEMPLATES, explicit or mutable */ -#define NO_MEMBER_TEMPLATES - -template class linked_ptr -{ -public: - -#ifndef NO_MEMBER_TEMPLATES -# define TEMPLATE_FUNCTION template - TEMPLATE_FUNCTION friend class linked_ptr; -#else -# define TEMPLATE_FUNCTION - typedef X Y; -#endif - - typedef X element_type; - - explicit linked_ptr(X* p = 0) throw() - : itsPtr(p) {itsPrev = itsNext = this;} - ~linked_ptr() - {release();} - linked_ptr(const linked_ptr& r) throw() - {acquire(r);} - linked_ptr& operator=(const linked_ptr& r) - { - if (this != &r) { - release(); - acquire(r); - } - return *this; - } - -#ifndef NO_MEMBER_TEMPLATES - template friend class linked_ptr; - template linked_ptr(const linked_ptr& r) throw() - {acquire(r);} - template linked_ptr& operator=(const linked_ptr& r) - { - if (this != &r) { - release(); - acquire(r); - } - return *this; - } -#endif // NO_MEMBER_TEMPLATES - - X& operator*() const throw() {return *itsPtr;} - X* operator->() const throw() {return itsPtr;} - X* get() const throw() {return itsPtr;} - bool unique() const throw() {return itsPrev ? itsPrev==this : true;} - -private: - X* itsPtr; - mutable const linked_ptr* itsPrev; - mutable const linked_ptr* itsNext; - - void acquire(const linked_ptr& r) throw() - { // insert this to the list - itsPtr = r.itsPtr; - itsNext = r.itsNext; - itsNext->itsPrev = this; - itsPrev = &r; -#ifndef mutable - r.itsNext = this; -#else // for ANSI-challenged compilers - (const_cast*>(&r))->itsNext = this; -#endif - } - -#ifndef NO_MEMBER_TEMPLATES - template void acquire(const linked_ptr& r) throw() - { // insert this to the list - itsPtr = r.itsPtr; - itsNext = r.itsNext; - itsNext->itsPrev = this; - itsPrev = &r; -#ifndef mutable - r.itsNext = this; -#else // for ANSI-challenged compilers - (const_cast*>(&r))->itsNext = this; -#endif - } -#endif // NO_MEMBER_TEMPLATES - - void release() - { // erase this from the list, delete if unique - if (unique()) delete itsPtr; - else { - itsPrev->itsNext = itsNext; - itsNext->itsPrev = itsPrev; - itsPrev = itsNext = 0; - } - itsPtr = 0; - } -}; - -} // namespace rtc - -#endif // WEBRTC_BASE_LINKED_PTR_H__ -