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)12suspended_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)16suspended_task::suspended_task(suspended_task&& other) 17 : resolver_(other.resolver_), ticket_(other.ticket_) { 18 other.resolver_ = nullptr; 19 } 20 ~suspended_task()21suspended_task::~suspended_task() { 22 reset(); 23 } 24 resolve(bool resume_task)25void 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)36suspended_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)45suspended_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)55void 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