aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/scheduler/multi_thread/handle/taskdump.rs
blob: 477d857d88f7843f526955a4a6fbd2ea640badbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use super::Handle;

use crate::runtime::Dump;

impl Handle {
    pub(crate) async fn dump(&self) -> Dump {
        let trace_status = &self.shared.trace_status;

        // If a dump is in progress, block.
        trace_status.start_trace_request(&self).await;

        let result = loop {
            if let Some(result) = trace_status.take_result() {
                break result;
            } else {
                self.notify_all();
                trace_status.result_ready.notified().await;
            }
        };

        // Allow other queued dumps to proceed.
        trace_status.end_trace_request(&self).await;

        result
    }
}