Bitcoin ABC  0.29.2
P2P Digital Currency
tokenpipe.h
Go to the documentation of this file.
1 // Copyright (c) 2021 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_UTIL_TOKENPIPE_H
6 #define BITCOIN_UTIL_TOKENPIPE_H
7 
8 #ifndef WIN32
9 
10 #include <cstdint>
11 #include <optional>
12 
14 class TokenPipeEnd {
15 private:
16  int m_fd = -1;
17 
18 public:
19  TokenPipeEnd(int fd = -1);
20  ~TokenPipeEnd();
21 
23  enum Status {
25  TS_ERR = -1,
27  TS_EOS = -2,
28  };
29 
38  int TokenWrite(uint8_t token);
39 
48  int TokenRead();
49 
51  void Close();
52 
54  bool IsOpen() { return m_fd != -1; }
55 
56  // Move-only class.
58  m_fd = other.m_fd;
59  other.m_fd = -1;
60  }
62  Close();
63  m_fd = other.m_fd;
64  other.m_fd = -1;
65  return *this;
66  }
67  TokenPipeEnd(const TokenPipeEnd &) = delete;
68  TokenPipeEnd &operator=(const TokenPipeEnd &) = delete;
69 };
70 
75 class TokenPipe {
76 private:
77  int m_fds[2] = {-1, -1};
78 
79  TokenPipe(int fds[2]) : m_fds{fds[0], fds[1]} {}
80 
81 public:
82  ~TokenPipe();
83 
89  static std::optional<TokenPipe> Make();
90 
96 
102 
106  void Close();
107 
108  // Move-only class.
109  TokenPipe(TokenPipe &&other) {
110  for (int i = 0; i < 2; ++i) {
111  m_fds[i] = other.m_fds[i];
112  other.m_fds[i] = -1;
113  }
114  }
116  Close();
117  for (int i = 0; i < 2; ++i) {
118  m_fds[i] = other.m_fds[i];
119  other.m_fds[i] = -1;
120  }
121  return *this;
122  }
123  TokenPipe(const TokenPipe &) = delete;
124  TokenPipe &operator=(const TokenPipe &) = delete;
125 };
126 
127 #endif // WIN32
128 
129 #endif // BITCOIN_UTIL_TOKENPIPE_H
One end of a token pipe.
Definition: tokenpipe.h:14
TokenPipeEnd(const TokenPipeEnd &)=delete
TokenPipeEnd(TokenPipeEnd &&other)
Definition: tokenpipe.h:57
TokenPipeEnd(int fd=-1)
Definition: tokenpipe.cpp:26
Status
Return value constants for TokenWrite and TokenRead.
Definition: tokenpipe.h:23
@ TS_ERR
I/O error.
Definition: tokenpipe.h:25
@ TS_EOS
Unexpected end of stream.
Definition: tokenpipe.h:27
bool IsOpen()
Return whether endpoint is open.
Definition: tokenpipe.h:54
TokenPipeEnd & operator=(TokenPipeEnd &&other)
Definition: tokenpipe.h:61
int TokenWrite(uint8_t token)
Write token to endpoint.
Definition: tokenpipe.cpp:32
void Close()
Explicit close function.
Definition: tokenpipe.cpp:68
TokenPipeEnd & operator=(const TokenPipeEnd &)=delete
int TokenRead()
Read token from endpoint.
Definition: tokenpipe.cpp:49
An interprocess or interthread pipe for sending tokens (one-byte values) over.
Definition: tokenpipe.h:75
void Close()
Close and end of the pipe that hasn't been moved out.
Definition: tokenpipe.cpp:93
TokenPipeEnd TakeReadEnd()
Take the read end of this pipe.
Definition: tokenpipe.cpp:14
TokenPipeEnd TakeWriteEnd()
Take the write end of this pipe.
Definition: tokenpipe.cpp:20
int m_fds[2]
Definition: tokenpipe.h:77
static std::optional< TokenPipe > Make()
Create a new pipe.
Definition: tokenpipe.cpp:75
TokenPipe & operator=(TokenPipe &&other)
Definition: tokenpipe.h:115
TokenPipe(TokenPipe &&other)
Definition: tokenpipe.h:109
TokenPipe(int fds[2])
Definition: tokenpipe.h:79
TokenPipe & operator=(const TokenPipe &)=delete
TokenPipe(const TokenPipe &)=delete