31 absl::Time deadline = absl::InfiniteFuture()) {
32 if (closed_ || state_) {
33 return FailedTask(absl::FailedPreconditionError(
34 "Native task owner already started or closed"));
36 if (deadline != absl::InfiniteFuture() && deadline <= absl::Now()) {
37 return FailedTask(absl::DeadlineExceededError(
"Owner deadline expired"));
39 auto state = std::make_shared<State>();
41 state->completion.SetCancellationCallback(
42 [
weak = std::weak_ptr<State>(state)] {
44 owned->RequestCancel();
50 children.
Add(state->timer);
53 [](
const absl::StatusOr<int>& result) -> absl::StatusOr<Unit> {
55 return result.status();
59 state->children = children.Finish();
60 if (deadline != absl::InfiniteFuture()) {
63 state->timer.
OnReady([weak = std::weak_ptr<State>(state)](
64 const absl::StatusOr<Unit>& result) {
66 if (
auto owned = weak.lock()) {
67 owned->property.Cancel();
71 state->property.OnReady([weak = std::weak_ptr<State>(state)](
72 const absl::StatusOr<int>& result) {
74 if (
auto owned = weak.lock()) {
75 owned->timer.Cancel();
79 if (state->alarm.valid()) {
80 state->alarm.OnReady([state](
const absl::StatusOr<Unit>& result) {
81 state->alarm_result = result;
83 state->timed_out =
true;
84 state->timer.Cancel();
85 state->property.Cancel();
86 }
else if (result.status().code() != absl::StatusCode::kCancelled) {
87 state->timer.Cancel();
88 state->property.Cancel();
93 state->children.OnReady([state](
const absl::StatusOr<Unit>& result) {
94 state->child_result = result;
95 if (state->alarm.valid() && !state->alarm.IsReady()) {
96 state->alarm.Cancel();
100 return state->joined;