| // 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/fpromise/promise.h> |
| |
| namespace fpromise { |
| |
| 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 fpromise |