scoped_pp_resource.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ppapi/shared_impl/scoped_pp_resource.h" 6 7#include "ppapi/shared_impl/ppapi_globals.h" 8#include "ppapi/shared_impl/resource.h" 9#include "ppapi/shared_impl/resource_tracker.h" 10 11namespace ppapi { 12 13ScopedPPResource::ScopedPPResource() : id_(0) {} 14 15ScopedPPResource::ScopedPPResource(PP_Resource resource) : id_(resource) { 16 CallAddRef(); 17} 18 19ScopedPPResource::ScopedPPResource(const PassRef&, PP_Resource resource) 20 : id_(resource) {} 21 22ScopedPPResource::ScopedPPResource(Resource* resource) 23 : id_(resource ? resource->GetReference() : 0) { 24 // GetReference AddRef's for us. 25} 26 27ScopedPPResource::ScopedPPResource(const ScopedPPResource& other) 28 : id_(other.id_) { 29 CallAddRef(); 30} 31 32ScopedPPResource::~ScopedPPResource() { CallRelease(); } 33 34ScopedPPResource& ScopedPPResource::operator=(PP_Resource resource) { 35 if (id_ == resource) 36 return *this; // Be careful about self-assignment. 37 CallRelease(); 38 id_ = resource; 39 CallAddRef(); 40 return *this; 41} 42 43ScopedPPResource& ScopedPPResource::operator=( 44 const ScopedPPResource& resource) { 45 if (id_ == resource.id_) 46 return *this; // Be careful about self-assignment. 47 CallRelease(); 48 id_ = resource.id_; 49 CallAddRef(); 50 return *this; 51} 52 53PP_Resource ScopedPPResource::Release() { 54 // We do NOT call CallRelease, because we want to pass our reference to the 55 // caller. 56 57 PP_Resource ret = id_; 58 id_ = 0; 59 return ret; 60} 61 62void ScopedPPResource::CallAddRef() { 63 if (id_) 64 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(id_); 65} 66 67void ScopedPPResource::CallRelease() { 68 if (id_) 69 PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(id_); 70} 71 72} // namespace ppapi 73