1b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien/* 2b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Copyright (C) 2014 The Android Open Source Project 3b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * 4b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Licensed under the Apache License, Version 2.0 (the "License"); 5b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * you may not use this file except in compliance with the License. 6b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * You may obtain a copy of the License at 7b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * 8b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * http://www.apache.org/licenses/LICENSE-2.0 9b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * 10b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Unless required by applicable law or agreed to in writing, software 11b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * distributed under the License is distributed on an "AS IS" BASIS, 12b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * See the License for the specific language governing permissions and 14b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * limitations under the License. 15b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien */ 16b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 17b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien// Base class for reference counted objects in Minikin 18b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 19b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#ifndef MINIKIN_REF_COUNTED_H 20b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#define MINIKIN_REF_COUNTED_H 21b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 22b80c1f19c58b927820a8a24bf2218e5645724608Raph Leviennamespace android { 23b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 24b80c1f19c58b927820a8a24bf2218e5645724608Raph Levienclass MinikinRefCounted { 25b80c1f19c58b927820a8a24bf2218e5645724608Raph Levienpublic: 26b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien void RefLocked() { mRefcount_++; } 27b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien void UnrefLocked() { if (--mRefcount_ == 0) { delete this; } } 28b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 29b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien // These refcount operations take the global lock. 30b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien void Ref(); 31b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien void Unref(); 32b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 33b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien MinikinRefCounted() : mRefcount_(1) { } 34b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 35b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien virtual ~MinikinRefCounted() { }; 36b80c1f19c58b927820a8a24bf2218e5645724608Raph Levienprivate: 37b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien int mRefcount_; 38b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien}; 39b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 406c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka// An RAII container for reference counted objects. 416c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka// Note: this is only suitable for clients which are _not_ holding the global lock. 426c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonakatemplate <typename T> 436c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonakaclass MinikinAutoUnref { 446c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonakapublic: 456c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka MinikinAutoUnref(T* obj) : mObj(obj) { 466c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka } 476c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka ~MinikinAutoUnref() { 486c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka mObj->Unref(); 496c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka } 506c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka T& operator*() const { return *mObj; } 516c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka T* operator->() const { return mObj; } 526c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka T* get() const { return mObj; } 536c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonakaprivate: 546c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka T* mObj; 556c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka}; 566c60831cfce24b0749f50f37231e0a56d8fd4b85Seigo Nonaka 57b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien} 58b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 59b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#endif // MINIKIN_REF_COUNTED_H