]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/include/seastar/core/thread_impl.hh
import 15.2.0 Octopus source
[ceph.git] / ceph / src / seastar / include / seastar / core / thread_impl.hh
1 /*
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
6 *
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
16 * under the License.
17 */
18
19 /*
20 * Copyright (C) 2016 ScyllaDB.
21 */
22
23 #pragma once
24 #include <seastar/core/preempt.hh>
25 #include <setjmp.h>
26 #include <ucontext.h>
27 #include <chrono>
28 #include <seastar/util/std-compat.hh>
29
30 namespace seastar {
31 /// Clock used for scheduling threads
32 using thread_clock = std::chrono::steady_clock;
33
34 /// \cond internal
35 class thread_context;
36 class scheduling_group;
37
38 struct jmp_buf_link {
39 #ifdef SEASTAR_ASAN_ENABLED
40 ucontext_t context;
41 void* fake_stack = nullptr;
42 const void* stack_bottom;
43 size_t stack_size;
44 #else
45 jmp_buf jmpbuf;
46 #endif
47 jmp_buf_link* link;
48 thread_context* thread;
49 public:
50 void initial_switch_in(ucontext_t* initial_context, const void* stack_bottom, size_t stack_size);
51 void switch_in();
52 void switch_out();
53 void initial_switch_in_completed();
54 void final_switch_out();
55 };
56
57 extern thread_local jmp_buf_link* g_current_context;
58
59 namespace thread_impl {
60
61 inline thread_context* get() {
62 return g_current_context->thread;
63 }
64
65 inline bool should_yield() {
66 if (need_preempt()) {
67 return true;
68 } else {
69 return false;
70 }
71 }
72
73 scheduling_group sched_group(const thread_context*);
74
75 void yield();
76 void switch_in(thread_context* to);
77 void switch_out(thread_context* from);
78 void init();
79
80 }
81 }
82 /// \endcond
83
84