// 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.
// Can't compile this for Zircon userspace yet since libstdc++ isn't available.
#ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
#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;
}
} // namespace fit
#endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE