mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-09 21:49:22 +00:00
Update child objects to ref the device. This allows them to outlive the device, making the implementation more robust such that it is OK to drop the device before other objects. Dropping the last external reference to the device is currently an implicit device.destroy(). This destruction breaks possible ref cycles where the device refs internal objects which have a back ref to the device. Bug: dawn:1164 Change-Id: I02d8e32a21dcc5f05e531bd690baac4a234b5f6b Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/90360 Reviewed-by: Loko Kung <lokokung@google.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Austin Eng <enga@chromium.org>
85 lines
2.1 KiB
C++
85 lines
2.1 KiB
C++
// Copyright 2017 The Dawn Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef SRC_DAWN_COMMON_REFCOUNTED_H_
|
|
#define SRC_DAWN_COMMON_REFCOUNTED_H_
|
|
|
|
#include <atomic>
|
|
#include <cstdint>
|
|
|
|
#include "dawn/common/RefBase.h"
|
|
|
|
class RefCount {
|
|
public:
|
|
// Create a refcount with a payload. The refcount starts initially at one.
|
|
explicit RefCount(uint64_t payload = 0);
|
|
|
|
uint64_t GetValueForTesting() const;
|
|
uint64_t GetPayload() const;
|
|
|
|
// Add a reference.
|
|
void Increment();
|
|
|
|
// Remove a reference. Returns true if this was the last reference.
|
|
bool Decrement();
|
|
|
|
private:
|
|
std::atomic<uint64_t> mRefCount;
|
|
};
|
|
|
|
class RefCounted {
|
|
public:
|
|
explicit RefCounted(uint64_t payload = 0);
|
|
|
|
uint64_t GetRefCountForTesting() const;
|
|
uint64_t GetRefCountPayload() const;
|
|
|
|
void Reference();
|
|
void Release();
|
|
|
|
void APIReference() { Reference(); }
|
|
void APIRelease() { Release(); }
|
|
|
|
protected:
|
|
virtual ~RefCounted();
|
|
|
|
// A Derived class may override this if they require a custom deleter.
|
|
virtual void DeleteThis();
|
|
|
|
private:
|
|
RefCount mRefCount;
|
|
};
|
|
|
|
template <typename T>
|
|
struct RefCountedTraits {
|
|
static constexpr T* kNullValue = nullptr;
|
|
static void Reference(T* value) { value->Reference(); }
|
|
static void Release(T* value) { value->Release(); }
|
|
};
|
|
|
|
template <typename T>
|
|
class Ref : public RefBase<T*, RefCountedTraits<T>> {
|
|
public:
|
|
using RefBase<T*, RefCountedTraits<T>>::RefBase;
|
|
};
|
|
|
|
template <typename T>
|
|
Ref<T> AcquireRef(T* pointee) {
|
|
Ref<T> ref;
|
|
ref.Acquire(pointee);
|
|
return ref;
|
|
}
|
|
|
|
#endif // SRC_DAWN_COMMON_REFCOUNTED_H_
|