| // 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 |