1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Can't compile this for Zircon userspace yet since libstdc++ isn't available.
6 #ifndef FIT_NO_STD_FOR_ZIRCON_USERSPACE
7 
8 #include <lib/fit/promise.h>
9 
10 namespace fit {
11 
suspended_task(const suspended_task & other)12 suspended_task::suspended_task(const suspended_task& other)
13     : resolver_(other.resolver_),
14       ticket_(resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0) {}
15 
suspended_task(suspended_task && other)16 suspended_task::suspended_task(suspended_task&& other)
17     : resolver_(other.resolver_), ticket_(other.ticket_) {
18     other.resolver_ = nullptr;
19 }
20 
~suspended_task()21 suspended_task::~suspended_task() {
22     reset();
23 }
24 
resolve(bool resume_task)25 void suspended_task::resolve(bool resume_task) {
26     if (resolver_) {
27         // Move the ticket to the stack to guard against possible re-entrance
28         // occurring as a side-effect of the task's own destructor running.
29         resolver* cached_resolver = resolver_;
30         ticket cached_ticket = ticket_;
31         resolver_ = nullptr;
32         cached_resolver->resolve_ticket(cached_ticket, resume_task);
33     }
34 }
35 
operator =(const suspended_task & other)36 suspended_task& suspended_task::operator=(const suspended_task& other) {
37     if (this != &other) {
38         reset();
39         resolver_ = other.resolver_;
40         ticket_ = resolver_ ? resolver_->duplicate_ticket(other.ticket_) : 0;
41     }
42     return *this;
43 }
44 
operator =(suspended_task && other)45 suspended_task& suspended_task::operator=(suspended_task&& other) {
46     if (this != &other) {
47         reset();
48         resolver_ = other.resolver_;
49         ticket_ = other.ticket_;
50         other.resolver_ = nullptr;
51     }
52     return *this;
53 }
54 
swap(suspended_task & other)55 void suspended_task::swap(suspended_task& other) {
56     if (this != &other) {
57         using std::swap;
58         swap(resolver_, other.resolver_);
59         swap(ticket_, other.ticket_);
60     }
61 }
62 
63 } // namespace fit
64 
65 #endif // FIT_NO_STD_FOR_ZIRCON_USERSPACE
66