mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-11 06:29:11 +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>
46 lines
1.6 KiB
C++
46 lines
1.6 KiB
C++
// Copyright 2022 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_NATIVE_REFCOUNTEDWITHEXTERNALCOUNT_H_
|
|
#define SRC_DAWN_NATIVE_REFCOUNTEDWITHEXTERNALCOUNT_H_
|
|
|
|
#include "dawn/common/RefCounted.h"
|
|
|
|
namespace dawn::native {
|
|
|
|
// RecCountedWithExternalCount is a version of RefCounted which tracks a separate
|
|
// refcount for calls to APIReference/APIRelease (refs added/removed by the application).
|
|
// The external refcount starts at 1, and the total refcount starts at 1 - i.e. the first
|
|
// ref is the external ref.
|
|
// Then, when the external refcount drops to zero, WillDropLastExternalRef is called.
|
|
// The derived class should override the behavior of WillDropLastExternalRef.
|
|
class RefCountedWithExternalCount : private RefCounted {
|
|
public:
|
|
using RefCounted::RefCounted;
|
|
using RefCounted::Reference;
|
|
using RefCounted::Release;
|
|
|
|
void APIReference();
|
|
void APIRelease();
|
|
|
|
private:
|
|
virtual void WillDropLastExternalRef() = 0;
|
|
|
|
RefCount mExternalRefCount;
|
|
};
|
|
|
|
} // namespace dawn::native
|
|
|
|
#endif // SRC_DAWN_NATIVE_REFCOUNTEDWITHEXTERNALCOUNT_H_
|