Reland of Delete rtc::linked_ptr. (patchset #1 id:1 of https://codereview.webrtc.org/2579753002/ )

Only use, in statstypes.h, replaced by rtc::scoped_refptr.

Reason for revert:
Intend to switch from unique_ptr to scoped_refptr,
and then reland.

Original issue's description:
> Revert of Delete rtc::linked_ptr. Only use, in statstypes.h, replaced bu std::unique_ptr. (patchset #1 id:1 of https://codereview.webrtc.org/2581663002/ )
>
> Reason for revert:
> This change broke Chrome too. It's stats processing wants to make a copy of webrtc's stats mapping, which is no longer possible with std::unique_ptr.
>
> Original issue's description:
> > Reland of Delete rtc::linked_ptr. Only use, in statstypes.h, replaced bu std::unique_ptr. (patchset #1 id:1 of https://codereview.webrtc.org/2576673002/ )
> >
> > Reason for revert:
> > Downstream project fixed to not make copies while iterating over the stats mapping.
> >
> > Original issue's description:
> > > Revert of Delete rtc::linked_ptr. Only use, in statstypes.h, replaced bu std::unique_ptr. (patchset #1 id:1 of https://codereview.webrtc.org/2567143003/ )
> > >
> > > Reason for revert:
> > > The change from rtc::linked_ptr to std::unique_ptr broke a downstream project.
> > >
> > > Original issue's description:
> > > > Delete rtc::linked_ptr. Only use, in statstypes.h, replaced with std::unique_ptr.
> > > >
> > > > BUG=webrtc:6424
> > > >
> > > > Committed: https://crrev.com/36f74e55792cae19db8b222c29aa38d6e0eb1225
> > > > Cr-Commit-Position: refs/heads/master@{#15588}
> > >
> > > TBR=solenberg@webrtc.org,pthatcher@webrtc.org,hta@webrtc.org
> > > # Skipping CQ checks because original CL landed less than 1 days ago.
> > > NOPRESUBMIT=true
> > > NOTREECHECKS=true
> > > NOTRY=true
> > > BUG=webrtc:6424
> > >
> > > Committed: https://crrev.com/8afbc8cba65d99bb7a0feece8fb3055b144106b1
> > > Cr-Commit-Position: refs/heads/master@{#15589}
> >
> > TBR=solenberg@webrtc.org,pthatcher@webrtc.org,hta@webrtc.org
> > # Not skipping CQ checks because original CL landed more than 1 days ago.
> > BUG=webrtc:6424
> >
> > Committed: https://crrev.com/06035cf53abad80b0525f286a3b81e388cc7ee00
> > Cr-Commit-Position: refs/heads/master@{#15627}
>
> TBR=solenberg@webrtc.org,pthatcher@webrtc.org,hta@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:6424
>
> Committed: https://crrev.com/6a58f33450a46370039cd82537612040a91165b3
> Cr-Commit-Position: refs/heads/master@{#15629}

TBR=solenberg@webrtc.org,pthatcher@webrtc.org,hta@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:6424

Review-Url: https://codereview.webrtc.org/2641793002
Cr-Commit-Position: refs/heads/master@{#16148}
diff --git a/webrtc/api/statstypes.h b/webrtc/api/statstypes.h
index 1a55145..788c2c4 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 @@
 
     ~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 @@
     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 @@
       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<Value> ValuePtr;
+  typedef rtc::scoped_refptr<Value> ValuePtr;
   typedef std::map<StatsValueName, ValuePtr> Values;
 
   // Ownership of |id| is passed to |this|.
diff --git a/webrtc/base/BUILD.gn b/webrtc/base/BUILD.gn
index 0902581..51882da 100644
--- a/webrtc/base/BUILD.gn
+++ b/webrtc/base/BUILD.gn
@@ -424,7 +424,6 @@
     "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 adaac2f..e1ee309 100644
--- a/webrtc/base/cryptstring.h
+++ b/webrtc/base/cryptstring.h
@@ -17,8 +17,6 @@
 #include <string>
 #include <vector>
 
-#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 65e5a00..0000000
--- 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 X> class linked_ptr
-{
-public:
-
-#ifndef NO_MEMBER_TEMPLATES
-#   define TEMPLATE_FUNCTION template <class Y>
-    TEMPLATE_FUNCTION friend class linked_ptr<Y>;
-#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 <class Y> friend class linked_ptr<Y>;
-    template <class Y> linked_ptr(const linked_ptr<Y>& r) throw()
-        {acquire(r);}
-    template <class Y> linked_ptr& operator=(const linked_ptr<Y>& 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<linked_ptr<X>*>(&r))->itsNext = this;
-#endif
-    }
-
-#ifndef NO_MEMBER_TEMPLATES
-    template <class Y> void acquire(const linked_ptr<Y>& 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<linked_ptr<X>*>(&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__
-