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