Spicy
context.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <cassert>
6 #include <iostream>
7 #include <memory>
8 #include <optional>
9 #include <utility>
10 #include <vector>
11 
12 #include <hilti/rt/fiber.h>
13 #include <hilti/rt/threading.h>
14 
15 namespace hilti::rt {
16 
24 struct Context {
28  explicit Context(vthread::ID vid);
29  ~Context();
30 
31  Context() = delete;
32  Context(const Context&) = delete;
33  Context(Context&&) = delete;
34  Context& operator=(const Context&) = delete;
35  Context& operator=(Context&&) = delete;
36 
41  vthread::ID vid;
42 
48 
51 
57  std::vector<std::shared_ptr<void>> hilti_globals;
58 
60  void* cookie = nullptr;
61 
63  uint64_t debug_indent{};
64 
70  const char* source_location{};
71 };
72 
73 namespace context {
74 namespace detail {
75 
83 extern Context*& current();
84 
86 extern Context* master();
87 
89 inline auto get(bool allow_missing_context = false) {
90  auto* ctx = current();
91 
92  if ( ! allow_missing_context )
93  assert(ctx);
94 
95  return ctx;
96 }
97 
102 hilti::rt::Context* set(Context* ctx);
103 
108 public:
109  explicit ResumableSetter(resumable::Handle* r) {
110  old = get()->resumable;
111  get()->resumable = r;
112  }
113 
114  ~ResumableSetter() { get()->resumable = old; }
115 
116  ResumableSetter(const ResumableSetter&) = delete;
117  ResumableSetter(ResumableSetter&&) = delete;
118  ResumableSetter& operator=(const ResumableSetter&) = delete;
119  ResumableSetter& operator=(ResumableSetter&&) = delete;
120 
121  resumable::Handle* old;
122 };
123 
124 } // namespace detail
125 
127 inline void saveCookie(void* cookie) { detail::get()->cookie = cookie; }
128 
130 inline void* cookie() { return detail::get()->cookie; }
131 
133 inline void clearCookie() { detail::get()->cookie = nullptr; }
134 
139 public:
140  explicit CookieSetter(void* cookie) {
141  _old = detail::get()->cookie;
142  detail::get()->cookie = cookie;
143  }
144 
145  ~CookieSetter() { detail::get()->cookie = _old; }
146 
147  CookieSetter() = delete;
148  CookieSetter(const CookieSetter&) = delete;
149  CookieSetter(CookieSetter&&) = delete;
150  CookieSetter& operator=(const CookieSetter&) = delete;
151  CookieSetter& operator=(CookieSetter&&) = delete;
152 
153 private:
154  void* _old;
155 };
156 
164 template<typename Function, typename... Params>
165 Resumable execute(Function f, Params&&... params) {
166  auto cb = [&](resumable::Handle* r) {
167  auto _ = detail::ResumableSetter(r);
168  return f(std::forward<Params>(params)...);
169  };
170 
171  Resumable r(std::move(cb));
172  r.run();
173  return r;
174 }
175 
176 } // namespace context
177 } // namespace hilti::rt
detail::FiberContext fiber
Definition: context.h:50
void * cookie
Definition: context.h:60
Definition: any.h:7
vthread::ID vid
Definition: context.h:41
const char * source_location
Definition: context.h:70
Definition: fiber.h:43
std::vector< std::shared_ptr< void > > hilti_globals
Definition: context.h:57
Definition: function.h:44
void run()
Definition: fiber.cc:552
uint64_t debug_indent
Definition: context.h:63
resumable::Handle * resumable
Definition: context.h:47
Definition: fiber.h:295
Definition: context.h:24
Definition: fiber.h:151