summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/client/app/src/async_task.rs
blob: 839db5e5628424bbe56513ac85d90d38fb2ee927 (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
27
28
29
30
31
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

//! Manage work across multiple threads.
//!
//! Each thread has thread-bound data which can be accessed in queued task functions.

pub type TaskFn<T> = Box<dyn FnOnce(&T) + Send + 'static>;

pub struct AsyncTask<T> {
    send: Box<dyn Fn(TaskFn<T>) + Send + Sync>,
}

impl<T> AsyncTask<T> {
    pub fn new<F: Fn(TaskFn<T>) + Send + Sync + 'static>(send: F) -> Self {
        AsyncTask {
            send: Box::new(send),
        }
    }

    pub fn push<F: FnOnce(&T) + Send + 'static>(&self, f: F) {
        (self.send)(Box::new(f));
    }

    pub fn wait<R: Send + 'static, F: FnOnce(&T) -> R + Send + 'static>(&self, f: F) -> R {
        let (tx, rx) = std::sync::mpsc::sync_channel(0);
        self.push(move |v| tx.send(f(v)).unwrap());
        rx.recv().unwrap()
    }
}