1 | // Copyright 2017 The Abseil Authors. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // https://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | // |
15 | // Core interfaces and definitions used by by low-level interfaces such as |
16 | // SpinLock. |
17 | |
18 | #ifndef ABSL_BASE_INTERNAL_SCHEDULING_MODE_H_ |
19 | #define ABSL_BASE_INTERNAL_SCHEDULING_MODE_H_ |
20 | |
21 | namespace absl { |
22 | namespace base_internal { |
23 | |
24 | // Used to describe how a thread may be scheduled. Typically associated with |
25 | // the declaration of a resource supporting synchronized access. |
26 | // |
27 | // SCHEDULE_COOPERATIVE_AND_KERNEL: |
28 | // Specifies that when waiting, a cooperative thread (e.g. a Fiber) may |
29 | // reschedule (using base::scheduling semantics); allowing other cooperative |
30 | // threads to proceed. |
31 | // |
32 | // SCHEDULE_KERNEL_ONLY: (Also described as "non-cooperative") |
33 | // Specifies that no cooperative scheduling semantics may be used, even if the |
34 | // current thread is itself cooperatively scheduled. This means that |
35 | // cooperative threads will NOT allow other cooperative threads to execute in |
36 | // their place while waiting for a resource of this type. Host operating system |
37 | // semantics (e.g. a futex) may still be used. |
38 | // |
39 | // When optional, clients should strongly prefer SCHEDULE_COOPERATIVE_AND_KERNEL |
40 | // by default. SCHEDULE_KERNEL_ONLY should only be used for resources on which |
41 | // base::scheduling (e.g. the implementation of a Scheduler) may depend. |
42 | // |
43 | // NOTE: Cooperative resources may not be nested below non-cooperative ones. |
44 | // This means that it is invalid to to acquire a SCHEDULE_COOPERATIVE_AND_KERNEL |
45 | // resource if a SCHEDULE_KERNEL_ONLY resource is already held. |
46 | enum SchedulingMode { |
47 | SCHEDULE_KERNEL_ONLY = 0, // Allow scheduling only the host OS. |
48 | SCHEDULE_COOPERATIVE_AND_KERNEL, // Also allow cooperative scheduling. |
49 | }; |
50 | |
51 | } // namespace base_internal |
52 | } // namespace absl |
53 | |
54 | #endif // ABSL_BASE_INTERNAL_SCHEDULING_MODE_H_ |
55 | |