10b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 20b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Copyright (C) 2013 The Android Open Source Project 30b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 40b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Licensed under the Apache License, Version 2.0 (the "License"); 50b575de8ed0b628d84d256f5846500b0385979bdTim Murray * you may not use this file except in compliance with the License. 60b575de8ed0b628d84d256f5846500b0385979bdTim Murray * You may obtain a copy of the License at 70b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 80b575de8ed0b628d84d256f5846500b0385979bdTim Murray * http://www.apache.org/licenses/LICENSE-2.0 90b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 100b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Unless required by applicable law or agreed to in writing, software 110b575de8ed0b628d84d256f5846500b0385979bdTim Murray * distributed under the License is distributed on an "AS IS" BASIS, 120b575de8ed0b628d84d256f5846500b0385979bdTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b575de8ed0b628d84d256f5846500b0385979bdTim Murray * See the License for the specific language governing permissions and 140b575de8ed0b628d84d256f5846500b0385979bdTim Murray * limitations under the License. 150b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 160b575de8ed0b628d84d256f5846500b0385979bdTim Murray 170b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef ANDROID_STRONG_POINTER_H 180b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_STRONG_POINTER_H 190b575de8ed0b628d84d256f5846500b0385979bdTim Murray 200b575de8ed0b628d84d256f5846500b0385979bdTim Murray//#include <cutils/atomic.h> 210b575de8ed0b628d84d256f5846500b0385979bdTim Murray 220b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <stdint.h> 230b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <sys/types.h> 240b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <stdlib.h> 250b575de8ed0b628d84d256f5846500b0385979bdTim Murray 260b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 270b575de8ed0b628d84d256f5846500b0385979bdTim Murraynamespace android { 280b575de8ed0b628d84d256f5846500b0385979bdTim Murray 290b575de8ed0b628d84d256f5846500b0385979bdTim Murrayclass TextOutput; 300b575de8ed0b628d84d256f5846500b0385979bdTim MurrayTextOutput& printStrongPointer(TextOutput& to, const void* val); 310b575de8ed0b628d84d256f5846500b0385979bdTim Murray 320b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> class wp; 330b575de8ed0b628d84d256f5846500b0385979bdTim Murray 340b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 350b575de8ed0b628d84d256f5846500b0385979bdTim Murray 360b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define COMPARE(_op_) \ 370b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const sp<T>& o) const { \ 380b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o.m_ptr; \ 390b575de8ed0b628d84d256f5846500b0385979bdTim Murray} \ 400b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const T* o) const { \ 410b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o; \ 420b575de8ed0b628d84d256f5846500b0385979bdTim Murray} \ 430b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename U> \ 440b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const sp<U>& o) const { \ 450b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o.m_ptr; \ 460b575de8ed0b628d84d256f5846500b0385979bdTim Murray} \ 470b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename U> \ 480b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const U* o) const { \ 490b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o; \ 500b575de8ed0b628d84d256f5846500b0385979bdTim Murray} \ 510b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const wp<T>& o) const { \ 520b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o.m_ptr; \ 530b575de8ed0b628d84d256f5846500b0385979bdTim Murray} \ 540b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename U> \ 550b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline bool operator _op_ (const wp<U>& o) const { \ 560b575de8ed0b628d84d256f5846500b0385979bdTim Murray return m_ptr _op_ o.m_ptr; \ 570b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 580b575de8ed0b628d84d256f5846500b0385979bdTim Murray 590b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 600b575de8ed0b628d84d256f5846500b0385979bdTim Murray 610b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> 620b575de8ed0b628d84d256f5846500b0385979bdTim Murrayclass sp 630b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 640b575de8ed0b628d84d256f5846500b0385979bdTim Murraypublic: 650b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline sp() : m_ptr(0) { } 660b575de8ed0b628d84d256f5846500b0385979bdTim Murray 670b575de8ed0b628d84d256f5846500b0385979bdTim Murray sp(T* other); 680b575de8ed0b628d84d256f5846500b0385979bdTim Murray sp(const sp<T>& other); 690b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename U> sp(U* other); 700b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename U> sp(const sp<U>& other); 710b575de8ed0b628d84d256f5846500b0385979bdTim Murray 720b575de8ed0b628d84d256f5846500b0385979bdTim Murray ~sp(); 730b575de8ed0b628d84d256f5846500b0385979bdTim Murray 740b575de8ed0b628d84d256f5846500b0385979bdTim Murray // Assignment 750b575de8ed0b628d84d256f5846500b0385979bdTim Murray 760b575de8ed0b628d84d256f5846500b0385979bdTim Murray sp& operator = (T* other); 770b575de8ed0b628d84d256f5846500b0385979bdTim Murray sp& operator = (const sp<T>& other); 780b575de8ed0b628d84d256f5846500b0385979bdTim Murray 790b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename U> sp& operator = (const sp<U>& other); 800b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename U> sp& operator = (U* other); 810b575de8ed0b628d84d256f5846500b0385979bdTim Murray 820b575de8ed0b628d84d256f5846500b0385979bdTim Murray //! Special optimization for use by ProcessState (and nobody else). 830b575de8ed0b628d84d256f5846500b0385979bdTim Murray void force_set(T* other); 840b575de8ed0b628d84d256f5846500b0385979bdTim Murray 850b575de8ed0b628d84d256f5846500b0385979bdTim Murray // Reset 860b575de8ed0b628d84d256f5846500b0385979bdTim Murray 870b575de8ed0b628d84d256f5846500b0385979bdTim Murray void clear(); 880b575de8ed0b628d84d256f5846500b0385979bdTim Murray 890b575de8ed0b628d84d256f5846500b0385979bdTim Murray // Accessors 900b575de8ed0b628d84d256f5846500b0385979bdTim Murray 910b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline T& operator* () const { return *m_ptr; } 920b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline T* operator-> () const { return m_ptr; } 930b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline T* get() const { return m_ptr; } 940b575de8ed0b628d84d256f5846500b0385979bdTim Murray 950b575de8ed0b628d84d256f5846500b0385979bdTim Murray // Operators 960b575de8ed0b628d84d256f5846500b0385979bdTim Murray 970b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(==) 980b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(!=) 990b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(>) 1000b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(<) 1010b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(<=) 1020b575de8ed0b628d84d256f5846500b0385979bdTim Murray COMPARE(>=) 1030b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1040b575de8ed0b628d84d256f5846500b0385979bdTim Murrayprivate: 1050b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename Y> friend class sp; 1060b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<typename Y> friend class wp; 1070b575de8ed0b628d84d256f5846500b0385979bdTim Murray void set_pointer(T* ptr); 1080b575de8ed0b628d84d256f5846500b0385979bdTim Murray T* m_ptr; 1090b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; 1100b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1110b575de8ed0b628d84d256f5846500b0385979bdTim Murray#undef COMPARE 1120b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1130b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> 1140b575de8ed0b628d84d256f5846500b0385979bdTim MurrayTextOutput& operator<<(TextOutput& to, const sp<T>& val); 1150b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1160b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 1170b575de8ed0b628d84d256f5846500b0385979bdTim Murray// No user serviceable parts below here. 1180b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1190b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1200b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>::sp(T* other) 1210b575de8ed0b628d84d256f5846500b0385979bdTim Murray: m_ptr(other) 1220b575de8ed0b628d84d256f5846500b0385979bdTim Murray { 1230b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (other) other->incStrong(this); 1240b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1250b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1260b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1270b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>::sp(const sp<T>& other) 1280b575de8ed0b628d84d256f5846500b0385979bdTim Murray: m_ptr(other.m_ptr) 1290b575de8ed0b628d84d256f5846500b0385979bdTim Murray { 1300b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->incStrong(this); 1310b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1320b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1330b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> template<typename U> 1340b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>::sp(U* other) : m_ptr(other) 1350b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1360b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (other) ((T*)other)->incStrong(this); 1370b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1380b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1390b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> template<typename U> 1400b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>::sp(const sp<U>& other) 1410b575de8ed0b628d84d256f5846500b0385979bdTim Murray: m_ptr(other.m_ptr) 1420b575de8ed0b628d84d256f5846500b0385979bdTim Murray { 1430b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->incStrong(this); 1440b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1450b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1460b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1470b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>::~sp() 1480b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1490b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->decStrong(this); 1500b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1510b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1520b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1530b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>& sp<T>::operator = (const sp<T>& other) { 1540b575de8ed0b628d84d256f5846500b0385979bdTim Murray T* otherPtr(other.m_ptr); 1550b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (otherPtr) otherPtr->incStrong(this); 1560b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->decStrong(this); 1570b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = otherPtr; 1580b575de8ed0b628d84d256f5846500b0385979bdTim Murray return *this; 1590b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1600b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1610b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1620b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>& sp<T>::operator = (T* other) 1630b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1640b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (other) other->incStrong(this); 1650b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->decStrong(this); 1660b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = other; 1670b575de8ed0b628d84d256f5846500b0385979bdTim Murray return *this; 1680b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1690b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1700b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> template<typename U> 1710b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>& sp<T>::operator = (const sp<U>& other) 1720b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1730b575de8ed0b628d84d256f5846500b0385979bdTim Murray T* otherPtr(other.m_ptr); 1740b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (otherPtr) otherPtr->incStrong(this); 1750b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->decStrong(this); 1760b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = otherPtr; 1770b575de8ed0b628d84d256f5846500b0385979bdTim Murray return *this; 1780b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1790b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1800b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> template<typename U> 1810b575de8ed0b628d84d256f5846500b0385979bdTim Murraysp<T>& sp<T>::operator = (U* other) 1820b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1830b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (other) ((T*)other)->incStrong(this); 1840b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) m_ptr->decStrong(this); 1850b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = other; 1860b575de8ed0b628d84d256f5846500b0385979bdTim Murray return *this; 1870b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1880b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1890b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1900b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid sp<T>::force_set(T* other) 1910b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1920b575de8ed0b628d84d256f5846500b0385979bdTim Murray other->forceIncStrong(this); 1930b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = other; 1940b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1950b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1960b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 1970b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid sp<T>::clear() 1980b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 1990b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (m_ptr) { 2000b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr->decStrong(this); 2010b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = 0; 2020b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2030b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 2040b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2050b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename T> 2060b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid sp<T>::set_pointer(T* ptr) { 2070b575de8ed0b628d84d256f5846500b0385979bdTim Murray m_ptr = ptr; 2080b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 2090b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2100b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> 2110b575de8ed0b628d84d256f5846500b0385979bdTim Murrayinline TextOutput& operator<<(TextOutput& to, const sp<T>& val) 2120b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ 2130b575de8ed0b628d84d256f5846500b0385979bdTim Murray return printStrongPointer(to, val.get()); 2140b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 2150b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2160b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; // namespace android 2170b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2180b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 2190b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2200b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif // ANDROID_STRONG_POINTER_H 221