StrongPointer.h revision 89daad6bae798779e57f252e9da4fe4e62337124
18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Copyright (C) 2013 The Android Open Source Project 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Licensed under the Apache License, Version 2.0 (the "License"); 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * you may not use this file except in compliance with the License. 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * You may obtain a copy of the License at 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://www.apache.org/licenses/LICENSE-2.0 98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * Unless required by applicable law or agreed to in writing, software 118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * See the License for the specific language governing permissions and 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * limitations under the License. 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#ifndef RS_STRONG_POINTER_H 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#define RS_STRONG_POINTER_H 198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle//#include <cutils/atomic.h> 218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <stdint.h> 238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <sys/types.h> 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#include <stdlib.h> 258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// --------------------------------------------------------------------------- 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlenamespace android { 288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathnamespace RSC { 298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathclass TextOutput; 318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan KamathTextOutput& printStrongPointer(TextOutput& to, const void* val); 328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathtemplate<typename T> class wp; 348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 35b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak// --------------------------------------------------------------------------- 368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath#define COMPARE(_op_) \ 388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const sp<T>& o) const { \ 398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return m_ptr _op_ o.m_ptr; \ 408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} \ 418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const T* o) const { \ 428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return m_ptr _op_ o; \ 438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} \ 448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U> \ 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const sp<U>& o) const { \ 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return m_ptr _op_ o.m_ptr; \ 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} \ 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U> \ 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const U* o) const { \ 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return m_ptr _op_ o; \ 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} \ 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const wp<T>& o) const { \ 53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return m_ptr _op_ o.m_ptr; \ 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} \ 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename U> \ 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline bool operator _op_ (const wp<U>& o) const { \ 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return m_ptr _op_ o.m_ptr; \ 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// --------------------------------------------------------------------------- 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T> 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleclass sp 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic: 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle inline sp() : m_ptr(0) { } 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle sp(T* other); 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle sp(const sp<T>& other); 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename U> sp(U* other); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename U> sp(const sp<U>& other); 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ~sp(); 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Assignment 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle sp& operator = (T* other); 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle sp& operator = (const sp<T>& other); 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename U> sp& operator = (const sp<U>& other); 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename U> sp& operator = (U* other); 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle //! Special optimization for use by ProcessState (and nobody else). 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void force_set(T* other); 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Reset 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void clear(); 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Accessors 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle inline T& operator* () const { return *m_ptr; } 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle inline T* operator-> () const { return m_ptr; } 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle inline T* get() const { return m_ptr; } 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Operators 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(==) 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(!=) 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(>) 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(<) 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(<=) 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle COMPARE(>=) 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleprivate: 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename Y> friend class sp; 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle template<typename Y> friend class wp; 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void set_pointer(T* ptr); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle T* m_ptr; 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}; 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#undef COMPARE 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T> 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin JuravleTextOutput& operator<<(TextOutput& to, const sp<T>& val); 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// --------------------------------------------------------------------------- 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// No user serviceable parts below here. 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(T* other) 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other) 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (other) other->incStrong(this); 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(const sp<T>& other) 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other.m_ptr) 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->incStrong(this); 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U> 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(U* other) : m_ptr(other) 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (other) ((T*)other)->incStrong(this); 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U> 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::sp(const sp<U>& other) 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle: m_ptr(other.m_ptr) 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->incStrong(this); 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>::~sp() 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->decStrong(this); 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (const sp<T>& other) { 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle T* otherPtr(other.m_ptr); 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (otherPtr) otherPtr->incStrong(this); 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->decStrong(this); 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = otherPtr; 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return *this; 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (T* other) 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (other) other->incStrong(this); 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->decStrong(this); 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = other; 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return *this; 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U> 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (const sp<U>& other) 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle T* otherPtr(other.m_ptr); 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (otherPtr) otherPtr->incStrong(this); 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->decStrong(this); 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = otherPtr; 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return *this; 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> template<typename U> 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlesp<T>& sp<T>::operator = (U* other) 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (other) ((T*)other)->incStrong(this); 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) m_ptr->decStrong(this); 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = other; 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return *this; 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::force_set(T* other) 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle other->forceIncStrong(this); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = other; 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::clear() 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (m_ptr) { 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr->decStrong(this); 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = 0; 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate<typename T> 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlevoid sp<T>::set_pointer(T* ptr) { 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle m_ptr = ptr; 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravletemplate <typename T> 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleinline TextOutput& operator<<(TextOutput& to, const sp<T>& val) 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle{ 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return printStrongPointer(to, val.get()); 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}; // namespace RSC 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}; // namespace android 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle// --------------------------------------------------------------------------- 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle#endif // RS_STRONG_POINTER_H 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle