COROIO: coroio/pipe/pipe.hpp Source File
COROIO
 
Loading...
Searching...
No Matches
pipe.hpp
1#pragma once
2
4
5namespace NNet {
6
7#ifndef _WIN32
8
9class TPipe {
10public:
11 template<typename TPoller>
12 TPipe(TPoller& poller, const std::string& exe, const std::vector<std::string>& args)
13 : PipeLow(exe, args)
14 {
15 PipeLow.Fork();
16
17 ReadHandle = std::make_unique<TPipeFileHandle<TPoller>>(PipeLow.ReadFd, poller);
18 WriteHandle = std::make_unique<TPipeFileHandle<TPoller>>(PipeLow.WriteFd, poller);
19 }
20
21 TFuture<ssize_t> ReadSome(void* buffer, size_t size);
22 TFuture<ssize_t> WriteSome(const void* buffer, size_t size);
23
24private:
25 struct TPipeLow {
26 TPipeLow(const std::string& exe, const std::vector<std::string>& args);
27 ~TPipeLow();
28
29 void Fork();
30
31 std::string Exe;
32 std::vector<std::string> Args;
33
34 int ReadFd = -1;
35 int WriteFd = -1;
36 int ChildPid = -1;
37 };
38
39 struct TTypelessFileHandle {
40 virtual ~TTypelessFileHandle() = default;
41 virtual TFuture<ssize_t> ReadSome(void* buffer, size_t size) = 0;
42 virtual TFuture<ssize_t> WriteSome(const void* buffer, size_t size) = 0;
43 };
44
45 template<typename TPoller>
46 struct TPipeFileHandle : public TTypelessFileHandle {
47 TPipeFileHandle(int fd, TPoller& poller)
48 : Handle(fd, poller)
49 { }
50
51 TFuture<ssize_t> ReadSome(void* buffer, size_t size) override {
52 co_return co_await Handle.ReadSome(buffer, size);
53 }
54 TFuture<ssize_t> WriteSome(const void* buffer, size_t size) override {
55 co_return co_await Handle.WriteSome(buffer, size);
56 }
57
58 typename TPoller::TFileHandle Handle;
59 };
60
61 TPipeLow PipeLow;
62 std::unique_ptr<TTypelessFileHandle> ReadHandle;
63 std::unique_ptr<TTypelessFileHandle> WriteHandle;
64};
65
66#endif // _WIN32
67
68} // namespace NNet {
Definition pipe.hpp:9
Implementation of a promise/future system for coroutines.
Future type for coroutines returning a value of type T.
Definition corochain.hpp:182