LLDB  mainline
Timeout.h
Go to the documentation of this file.
1 //===-- Timeout.h -----------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_UTILITY_TIMEOUT_H
10 #define LLDB_UTILITY_TIMEOUT_H
11 
12 #include "llvm/ADT/Optional.h"
13 #include "llvm/Support/Chrono.h"
14 #include "llvm/Support/FormatProviders.h"
15 
16 namespace lldb_private {
17 
18 // A general purpose class for representing timeouts for various APIs. It's
19 // basically an llvm::Optional<std::chrono::duration<int64_t, Ratio>>, but we
20 // customize it a bit to enable the standard chrono implicit conversions (e.g.
21 // from Timeout<std::milli> to Timeout<std::micro>.
22 //
23 // The intended meaning of the values is:
24 // - llvm::None - no timeout, the call should wait forever - 0 - poll, only
25 // complete the call if it will not block - >0 - wait for a given number of
26 // units for the result
27 template <typename Ratio>
28 class Timeout : public llvm::Optional<std::chrono::duration<int64_t, Ratio>> {
29 private:
30  template <typename Ratio2> using Dur = std::chrono::duration<int64_t, Ratio2>;
31  template <typename Rep2, typename Ratio2>
32  using EnableIf = std::enable_if<
33  std::is_convertible<std::chrono::duration<Rep2, Ratio2>,
34  std::chrono::duration<int64_t, Ratio>>::value>;
35 
36  using Base = llvm::Optional<Dur<Ratio>>;
37 
38 public:
39  Timeout(llvm::NoneType none) : Base(none) {}
40 
41  template <typename Ratio2,
42  typename = typename EnableIf<int64_t, Ratio2>::type>
43  Timeout(const Timeout<Ratio2> &other)
44  : Base(other ? Base(Dur<Ratio>(*other)) : llvm::None) {}
45 
46  template <typename Rep2, typename Ratio2,
47  typename = typename EnableIf<Rep2, Ratio2>::type>
48  Timeout(const std::chrono::duration<Rep2, Ratio2> &other)
49  : Base(Dur<Ratio>(other)) {}
50 };
51 
52 } // namespace lldb_private
53 
54 namespace llvm {
55 template<typename Ratio>
56 struct format_provider<lldb_private::Timeout<Ratio>, void> {
57  static void format(const lldb_private::Timeout<Ratio> &timeout,
58  raw_ostream &OS, StringRef Options) {
59  typedef typename lldb_private::Timeout<Ratio>::value_type Dur;
60 
61  if (!timeout)
62  OS << "<infinite>";
63  else
64  format_provider<Dur>::format(*timeout, OS, Options);
65  }
66 };
67 }
68 
69 #endif // LLDB_UTILITY_TIMEOUT_H
lldb_private::Timeout::Timeout
Timeout(const Timeout< Ratio2 > &other)
Definition: Timeout.h:43
llvm
Definition: Debugger.h:49
lldb_private::Timeout< std::micro >::EnableIf
std::enable_if< std::is_convertible< std::chrono::duration< Rep2, Ratio2 >, std::chrono::duration< int64_t, std::micro > >::value > EnableIf
Definition: Timeout.h:34
lldb_private::Timeout< std::micro >::Dur
std::chrono::duration< int64_t, Ratio2 > Dur
Definition: Timeout.h:30
Base
lldb_private::Timeout
Definition: Connection.h:25
llvm::format_provider< lldb_private::Timeout< Ratio >, void >::format
static void format(const lldb_private::Timeout< Ratio > &timeout, raw_ostream &OS, StringRef Options)
Definition: Timeout.h:57
lldb_private::Timeout::Timeout
Timeout(llvm::NoneType none)
Definition: Timeout.h:39
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
lldb_private::Timeout::Timeout
Timeout(const std::chrono::duration< Rep2, Ratio2 > &other)
Definition: Timeout.h:48