// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ppapi/shared_impl/scoped_pp_resource.h" #include "ppapi/shared_impl/ppapi_globals.h" #include "ppapi/shared_impl/resource.h" #include "ppapi/shared_impl/resource_tracker.h" namespace ppapi { ScopedPPResource::ScopedPPResource() : id_(0) { } ScopedPPResource::ScopedPPResource(PP_Resource resource) : id_(resource) { CallAddRef(); } ScopedPPResource::ScopedPPResource(const PassRef&, PP_Resource resource) : id_(resource) { } ScopedPPResource::ScopedPPResource(Resource* resource) : id_(resource ? resource->GetReference() : 0) { // GetReference AddRef's for us. } ScopedPPResource::ScopedPPResource(const ScopedPPResource& other) : id_(other.id_) { CallAddRef(); } ScopedPPResource::~ScopedPPResource() { CallRelease(); } ScopedPPResource& ScopedPPResource::operator=(PP_Resource resource) { if (id_ == resource) return *this; // Be careful about self-assignment. CallRelease(); id_ = resource; CallAddRef(); return *this; } ScopedPPResource& ScopedPPResource::operator=( const ScopedPPResource& resource) { if (id_ == resource.id_) return *this; // Be careful about self-assignment. CallRelease(); id_ = resource.id_; CallAddRef(); return *this; } PP_Resource ScopedPPResource::Release() { // We do NOT call CallRelease, because we want to pass our reference to the // caller. PP_Resource ret = id_; id_ = 0; return ret; } void ScopedPPResource::CallAddRef() { if (id_) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(id_); } void ScopedPPResource::CallRelease() { if (id_) PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(id_); } } // namespace ppapi