1 //===--- Cancellation.cpp -----------------------------------------*-C++-*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "support/Cancellation.h"
15 char CancelledError::ID
= 0;
17 // We don't want a cancelable scope to "shadow" an enclosing one.
19 std::shared_ptr
<std::atomic
<int>> Cancelled
;
20 const CancelState
*Parent
;
22 static Key
<CancelState
> StateKey
;
24 std::pair
<Context
, Canceler
> cancelableTask(int Reason
) {
25 assert(Reason
!= 0 && "Can't detect cancellation if Reason is zero");
27 State
.Cancelled
= std::make_shared
<std::atomic
<int>>();
28 State
.Parent
= Context::current().get(StateKey
);
30 Context::current().derive(StateKey
, State
),
31 [Reason
, Flag(State
.Cancelled
)] { *Flag
= Reason
; },
35 int isCancelled(const Context
&Ctx
) {
36 for (const CancelState
*State
= Ctx
.get(StateKey
); State
!= nullptr;
37 State
= State
->Parent
)
38 if (int Reason
= State
->Cancelled
->load())