You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.6 KiB
59 lines
1.6 KiB
// Copyright 2018 The Fuchsia 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 <lib/fit/promise.h>
|
|
|
|
namespace fit {
|
|
|
|
suspended_task::suspended_task(const suspended_task& other)
|
|
: resolver_(other.resolver_),
|
|
ticket_(resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0) {}
|
|
|
|
suspended_task::suspended_task(suspended_task&& other)
|
|
: resolver_(other.resolver_), ticket_(other.ticket_) {
|
|
other.resolver_ = nullptr;
|
|
}
|
|
|
|
suspended_task::~suspended_task() { reset(); }
|
|
|
|
void suspended_task::resolve(bool resume_task) {
|
|
if (resolver_) {
|
|
// Move the ticket to the stack to guard against possible re-entrance
|
|
// occurring as a side-effect of the task's own destructor running.
|
|
resolver* cached_resolver = resolver_;
|
|
ticket cached_ticket = ticket_;
|
|
resolver_ = nullptr;
|
|
cached_resolver->resolve_ticket(cached_ticket, resume_task);
|
|
}
|
|
}
|
|
|
|
suspended_task& suspended_task::operator=(const suspended_task& other) {
|
|
if (this != &other) {
|
|
reset();
|
|
resolver_ = other.resolver_;
|
|
ticket_ = resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
suspended_task& suspended_task::operator=(suspended_task&& other) {
|
|
if (this != &other) {
|
|
reset();
|
|
resolver_ = other.resolver_;
|
|
ticket_ = other.ticket_;
|
|
other.resolver_ = nullptr;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
void suspended_task::swap(suspended_task& other) {
|
|
if (this != &other) {
|
|
using std::swap;
|
|
swap(resolver_, other.resolver_);
|
|
swap(ticket_, other.ticket_);
|
|
}
|
|
}
|
|
|
|
} // namespace fit
|