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
32
33
34
35
36
37
38
39
40
41
42
//! デバイスに対する各種操作のデッドライン.
use std::time::Duration;

/// 各種操作のデッドラインを表現するためのオブジェクト.
///
/// # 注意
///
/// ここでの"デッドライン"とは、厳密な上限ではなく、
/// 「可能であれば、この時間までに実行してほしい」というヒントに過ぎないことは注意が必要。
///
/// そのため、ハードリミットというよりは、操作間の優先順位を示すためのもの、という意味合いが強い
/// (e.g., リソースに余裕がない場合には、デッドラインが近いものから優先的に処理される)。
///
/// なお、デッドラインが等しい場合には、先にデバイスに到着したリクエストの方が優先される.
#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub enum Deadline {
    /// 可能な限り早急に処理して欲しいリクエストに指定するデッドライン.
    ///
    /// `Within(Duration::from_secs(0))`よりも優先度は高い.
    Immediate,

    /// 指定された時間以内での実行を期待するリクエストに指定するデッドライン.
    ///
    /// このデッドライン指定は、デバイスにリクエストが届いたタイミングで、
    /// 絶対時刻(i.e., `SystemTime::now() + 指定尺`)に変換され、
    /// その値を元にリクエストのスケジューリングが行われる.
    ///
    /// そのため「14:10に発行された`Within(Duration::from_secs(5))`のリクエスト」と
    /// 「14:00に発行された`Within(Duration::from_secs(10)`のリクエスト」では、
    /// 後者の方が優先度が高く、より早く実行されることとなる.
    Within(Duration),

    /// 実行がいくら遅延されても問題がないようなリクエストに指定するデッドライン(デフォルト値).
    ///
    /// `Immediate`ないし`Within(_)`が指定されたリクエストが一つでもある間は、そちらが優先される.
    Infinity,
}
impl Default for Deadline {
    fn default() -> Self {
        Deadline::Infinity
    }
}