Seastar
High performance C++ framework for concurrent servers
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 <seastar/util/std-compat.hh>
26#include <setjmp.h>
27#include <ucontext.h>
28#include <chrono>
29
30namespace seastar {
32using thread_clock = std::chrono::steady_clock;
33
35class thread_context;
36class scheduling_group;
37
38struct 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;
49public:
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
57extern thread_local jmp_buf_link* g_current_context;
58
59namespace thread_impl {
60
61inline thread_context* get() {
62 return g_current_context->thread;
63}
64
65inline bool should_yield() {
66 if (need_preempt()) {
67 return true;
68 } else {
69 return false;
70 }
71}
72
73scheduling_group sched_group(const thread_context*);
74
75void yield();
76void switch_in(thread_context* to);
77void switch_out(thread_context* from);
78void init();
79
80}
81}
83
84
future yield() noexcept
Returns a future which is not ready but is scheduled to resolve soon.
Seastar API namespace.
Definition: abort_on_ebadf.hh:26