123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Warray-bounds" // need because of bug in gcc4.9.2
- #endif
- #include "defaults.h"
- #include "file.h"
- #include <util/generic/ptr.h>
- #include <util/network/pair.h>
- #include <util/generic/noncopyable.h>
- using PIPEHANDLE = SOCKET;
- #define INVALID_PIPEHANDLE INVALID_SOCKET
- /// Pipe-like object: pipe on POSIX and socket on windows
- class TPipeHandle: public TNonCopyable {
- public:
- inline TPipeHandle() noexcept
- : Fd_(INVALID_PIPEHANDLE)
- {
- }
- inline TPipeHandle(PIPEHANDLE fd) noexcept
- : Fd_(fd)
- {
- }
- inline ~TPipeHandle() {
- Close();
- }
- bool Close() noexcept;
- inline PIPEHANDLE Release() noexcept {
- PIPEHANDLE ret = Fd_;
- Fd_ = INVALID_PIPEHANDLE;
- return ret;
- }
- inline void Swap(TPipeHandle& r) noexcept {
- DoSwap(Fd_, r.Fd_);
- }
- inline operator PIPEHANDLE() const noexcept {
- return Fd_;
- }
- inline bool IsOpen() const noexcept {
- return Fd_ != INVALID_PIPEHANDLE;
- }
- ssize_t Read(void* buffer, size_t byteCount) const noexcept;
- ssize_t Write(const void* buffer, size_t byteCount) const noexcept;
- // Only CloseOnExec is supported
- static void Pipe(TPipeHandle& reader, TPipeHandle& writer, EOpenMode mode = 0);
- private:
- PIPEHANDLE Fd_;
- };
- class TPipe {
- public:
- TPipe();
- /// Takes ownership of handle, so closes it when the last holder of descriptor dies.
- explicit TPipe(PIPEHANDLE fd);
- ~TPipe();
- void Close();
- bool IsOpen() const noexcept;
- PIPEHANDLE GetHandle() const noexcept;
- size_t Read(void* buf, size_t len) const;
- size_t Write(const void* buf, size_t len) const;
- // Only CloseOnExec is supported
- static void Pipe(TPipe& reader, TPipe& writer, EOpenMode mode = 0);
- private:
- class TImpl;
- using TImplRef = TSimpleIntrusivePtr<TImpl>;
- TImplRef Impl_;
- };
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|