summaryrefslogtreecommitdiffstats
path: root/dom/media/eme/clearkey/RefCounted.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/eme/clearkey/RefCounted.h')
-rw-r--r--dom/media/eme/clearkey/RefCounted.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/dom/media/eme/clearkey/RefCounted.h b/dom/media/eme/clearkey/RefCounted.h
new file mode 100644
index 0000000000..25f308164c
--- /dev/null
+++ b/dom/media/eme/clearkey/RefCounted.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2015, Mozilla Foundation and contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RefCount_h__
+#define __RefCount_h__
+
+#include <assert.h>
+#include <stdint.h>
+
+#include <atomic>
+
+#include "ClearKeyUtils.h"
+
+// Note: Thread safe.
+class RefCounted {
+ public:
+ void AddRef() { ++mRefCount; }
+
+ uint32_t Release() {
+ uint32_t newCount = --mRefCount;
+ if (!newCount) {
+ delete this;
+ }
+ return newCount;
+ }
+
+ protected:
+ RefCounted() : mRefCount(0) {}
+ virtual ~RefCounted() { assert(!mRefCount); }
+ std::atomic<uint32_t> mRefCount;
+};
+
+template <class T>
+class RefPtr {
+ public:
+ RefPtr(const RefPtr& src) { Set(src.mPtr); }
+
+ explicit RefPtr(T* aPtr) { Set(aPtr); }
+ RefPtr() { Set(nullptr); }
+
+ ~RefPtr() { Set(nullptr); }
+ T* operator->() const { return mPtr; }
+ T** operator&() { return &mPtr; }
+ T* operator->() { return mPtr; }
+ operator T*() { return mPtr; }
+
+ T* Get() const { return mPtr; }
+
+ RefPtr& operator=(T* aVal) {
+ Set(aVal);
+ return *this;
+ }
+
+ private:
+ T* Set(T* aPtr) {
+ if (mPtr == aPtr) {
+ return aPtr;
+ }
+ if (mPtr) {
+ mPtr->Release();
+ }
+ mPtr = aPtr;
+ if (mPtr) {
+ aPtr->AddRef();
+ }
+ return mPtr;
+ }
+
+ T* mPtr = nullptr;
+};
+
+#endif // __RefCount_h__