@@ -135,6 +135,7 @@ tasktrace current_tasktrace() noexcept {
135
135
auto main = current_backtrace_tasklocal ();
136
136
137
137
tasktrace::vector_type prev;
138
+ tasktrace::vector_resume_points_type prev_resume_points;
138
139
size_t hash = 0 ;
139
140
if (local_engine && g_current_context) {
140
141
task* tsk = nullptr ;
@@ -148,6 +149,7 @@ tasktrace current_tasktrace() noexcept {
148
149
149
150
while (tsk && prev.size () < prev.max_size ()) {
150
151
shared_backtrace bt = tsk->get_backtrace ();
152
+ prev_resume_points.push_back (tsk->get_resume_point ());
151
153
hash *= 31 ;
152
154
if (bt) {
153
155
hash ^= bt->hash ();
@@ -161,7 +163,7 @@ tasktrace current_tasktrace() noexcept {
161
163
}
162
164
}
163
165
164
- return tasktrace (std::move (main), std::move (prev), hash, current_scheduling_group ());
166
+ return tasktrace (std::move (main), std::move (prev), std::move (prev_resume_points), hash, current_scheduling_group ());
165
167
}
166
168
167
169
saved_backtrace current_backtrace () noexcept {
@@ -175,6 +177,14 @@ tasktrace::tasktrace(simple_backtrace main, tasktrace::vector_type prev, size_t
175
177
, _hash(_main.hash() * 31 ^ prev_hash)
176
178
{ }
177
179
180
+ tasktrace::tasktrace (simple_backtrace main, tasktrace::vector_type prev, vector_resume_points_type prev_resume_points, size_t prev_hash, scheduling_group sg) noexcept
181
+ : _main(std::move(main))
182
+ , _prev(std::move(prev))
183
+ , _prev_resume_points(std::move(prev_resume_points))
184
+ , _sg(sg)
185
+ , _hash(_main.hash() * 31 ^ prev_hash)
186
+ { }
187
+
178
188
bool tasktrace::operator ==(const tasktrace& o) const noexcept {
179
189
return _hash == o._hash && _main == o._main && _prev == o._prev ;
180
190
}
@@ -203,8 +213,15 @@ auto formatter<seastar::tasktrace>::format(const seastar::tasktrace& b, format_c
203
213
-> decltype (ctx.out()) {
204
214
auto out = ctx.out ();
205
215
out = fmt::format_to (out, " {}" , b._main );
206
- for (auto && e : b._prev ) {
216
+ for (auto i = 0u ; i < b._prev .size (); ++i) {
217
+ const auto &e = b._prev [i];
218
+ auto resume_loc = i < b._prev_resume_points .size () ? b._prev_resume_points [i] : std::source_location{};
219
+
207
220
out = fmt::format_to (out, " \n --------" );
221
+
222
+ if (resume_loc.file_name ()[0 ] != 0 ) {
223
+ out = fmt::format_to (out, " \n {}:{}:{}" , resume_loc.file_name (), resume_loc.line (), resume_loc.column ());
224
+ }
208
225
out = std::visit (seastar::make_visitor (
209
226
[&] (const seastar::shared_backtrace& sb) {
210
227
return fmt::format_to (out, " \n {}" , sb);
0 commit comments