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