Commit c1e775f0 authored by Marijn Kruisselbrink's avatar Marijn Kruisselbrink Committed by Commit Bot

Allow custom deleters for base::Owned.

And use that to fix test flakiness caused by the listener in
NativeFileSystemDirectoryHandleImpl::GetEntries sometimes not being
deleted on the right sequence.

Bug: 1035115
Change-Id: I03f404db002e8deb6cad885ba189e48333676a73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1972774Reviewed-by: default avatarAlbert J. Wong <ajwong@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726191}
parent 4317a101
......@@ -363,9 +363,10 @@ static inline internal::OwnedWrapper<T> Owned(T* o) {
return internal::OwnedWrapper<T>(o);
}
template <typename T>
static inline internal::OwnedWrapper<T> Owned(std::unique_ptr<T>&& ptr) {
return internal::OwnedWrapper<T>(std::move(ptr));
template <typename T, typename Deleter>
static inline internal::OwnedWrapper<T, Deleter> Owned(
std::unique_ptr<T, Deleter>&& ptr) {
return internal::OwnedWrapper<T, Deleter>(std::move(ptr));
}
// Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr)
......
......@@ -104,15 +104,16 @@ struct IgnoreResultHelper {
T functor_;
};
template <typename T>
template <typename T, typename Deleter = std::default_delete<T>>
class OwnedWrapper {
public:
explicit OwnedWrapper(T* o) : ptr_(o) {}
explicit OwnedWrapper(std::unique_ptr<T>&& ptr) : ptr_(std::move(ptr)) {}
explicit OwnedWrapper(std::unique_ptr<T, Deleter>&& ptr)
: ptr_(std::move(ptr)) {}
T* get() const { return ptr_.get(); }
private:
std::unique_ptr<T> ptr_;
std::unique_ptr<T, Deleter> ptr_;
};
// PassedWrapper is a copyable adapter for a scoper that ignores const.
......@@ -952,9 +953,11 @@ struct BindUnwrapTraits<internal::RetainedRefWrapper<T>> {
static T* Unwrap(const internal::RetainedRefWrapper<T>& o) { return o.get(); }
};
template <typename T>
struct BindUnwrapTraits<internal::OwnedWrapper<T>> {
static T* Unwrap(const internal::OwnedWrapper<T>& o) { return o.get(); }
template <typename T, typename Deleter>
struct BindUnwrapTraits<internal::OwnedWrapper<T, Deleter>> {
static T* Unwrap(const internal::OwnedWrapper<T, Deleter>& o) {
return o.get();
}
};
template <typename T>
......
......@@ -173,9 +173,14 @@ void NativeFileSystemDirectoryHandleImpl::GetEntries(
pending_listener) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
auto listener = std::make_unique<
mojo::Remote<blink::mojom::NativeFileSystemDirectoryEntriesListener>>(
std::move(pending_listener));
std::unique_ptr<
mojo::Remote<blink::mojom::NativeFileSystemDirectoryEntriesListener>,
base::OnTaskRunnerDeleter>
listener(
new mojo::Remote<
blink::mojom::NativeFileSystemDirectoryEntriesListener>(
std::move(pending_listener)),
base::OnTaskRunnerDeleter(base::SequencedTaskRunnerHandle::Get()));
listener->reset_on_disconnect();
DoFileSystemOperation(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment