aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/neh/asio/asio.cpp
diff options
context:
space:
mode:
authormonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
committermonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
commit06e5c21a835c0e923506c4ff27929f34e00761c2 (patch)
tree75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /library/cpp/neh/asio/asio.cpp
parent03f024c4412e3aa613bb543cf1660176320ba8f4 (diff)
downloadydb-06e5c21a835c0e923506c4ff27929f34e00761c2.tar.gz
fix ya.make
Diffstat (limited to 'library/cpp/neh/asio/asio.cpp')
-rw-r--r--library/cpp/neh/asio/asio.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/library/cpp/neh/asio/asio.cpp b/library/cpp/neh/asio/asio.cpp
new file mode 100644
index 0000000000..8b6cf383ea
--- /dev/null
+++ b/library/cpp/neh/asio/asio.cpp
@@ -0,0 +1,187 @@
+#include "io_service_impl.h"
+#include "deadline_timer_impl.h"
+#include "tcp_socket_impl.h"
+#include "tcp_acceptor_impl.h"
+
+using namespace NDns;
+using namespace NAsio;
+
+namespace NAsio {
+ TIOService::TWork::TWork(TWork& w)
+ : Srv_(w.Srv_)
+ {
+ Srv_.GetImpl().WorkStarted();
+ }
+
+ TIOService::TWork::TWork(TIOService& srv)
+ : Srv_(srv)
+ {
+ Srv_.GetImpl().WorkStarted();
+ }
+
+ TIOService::TWork::~TWork() {
+ Srv_.GetImpl().WorkFinished();
+ }
+
+ TIOService::TIOService()
+ : Impl_(new TImpl())
+ {
+ }
+
+ TIOService::~TIOService() {
+ }
+
+ void TIOService::Run() {
+ Impl_->Run();
+ }
+
+ void TIOService::Post(TCompletionHandler h) {
+ Impl_->Post(std::move(h));
+ }
+
+ void TIOService::Abort() {
+ Impl_->Abort();
+ }
+
+ TDeadlineTimer::TDeadlineTimer(TIOService& srv) noexcept
+ : Srv_(srv)
+ , Impl_(nullptr)
+ {
+ }
+
+ TDeadlineTimer::~TDeadlineTimer() {
+ if (Impl_) {
+ Srv_.GetImpl().ScheduleOp(new TUnregisterTimerOperation(Impl_));
+ }
+ }
+
+ void TDeadlineTimer::AsyncWaitExpireAt(TDeadline deadline, THandler h) {
+ if (!Impl_) {
+ Impl_ = new TDeadlineTimer::TImpl(Srv_.GetImpl());
+ Srv_.GetImpl().ScheduleOp(new TRegisterTimerOperation(Impl_));
+ }
+ Impl_->AsyncWaitExpireAt(deadline, h);
+ }
+
+ void TDeadlineTimer::Cancel() {
+ Impl_->Cancel();
+ }
+
+ TTcpSocket::TTcpSocket(TIOService& srv) noexcept
+ : Srv_(srv)
+ , Impl_(new TImpl(srv.GetImpl()))
+ {
+ }
+
+ TTcpSocket::~TTcpSocket() {
+ }
+
+ void TTcpSocket::AsyncConnect(const TEndpoint& ep, TTcpSocket::TConnectHandler h, TDeadline deadline) {
+ Impl_->AsyncConnect(ep, h, deadline);
+ }
+
+ void TTcpSocket::AsyncWrite(TSendedData& d, TTcpSocket::TWriteHandler h, TDeadline deadline) {
+ Impl_->AsyncWrite(d, h, deadline);
+ }
+
+ void TTcpSocket::AsyncWrite(TContIOVector* vec, TWriteHandler h, TDeadline deadline) {
+ Impl_->AsyncWrite(vec, h, deadline);
+ }
+
+ void TTcpSocket::AsyncWrite(const void* data, size_t size, TWriteHandler h, TDeadline deadline) {
+ class TBuffers: public IBuffers {
+ public:
+ TBuffers(const void* theData, size_t theSize)
+ : Part(theData, theSize)
+ , IOVec(&Part, 1)
+ {
+ }
+
+ TContIOVector* GetIOvec() override {
+ return &IOVec;
+ }
+
+ IOutputStream::TPart Part;
+ TContIOVector IOVec;
+ };
+
+ TSendedData d(new TBuffers(data, size));
+ Impl_->AsyncWrite(d, h, deadline);
+ }
+
+ void TTcpSocket::AsyncRead(void* buff, size_t size, TTcpSocket::TReadHandler h, TDeadline deadline) {
+ Impl_->AsyncRead(buff, size, h, deadline);
+ }
+
+ void TTcpSocket::AsyncReadSome(void* buff, size_t size, TTcpSocket::TReadHandler h, TDeadline deadline) {
+ Impl_->AsyncReadSome(buff, size, h, deadline);
+ }
+
+ void TTcpSocket::AsyncPollRead(TTcpSocket::TPollHandler h, TDeadline deadline) {
+ Impl_->AsyncPollRead(h, deadline);
+ }
+
+ void TTcpSocket::AsyncPollWrite(TTcpSocket::TPollHandler h, TDeadline deadline) {
+ Impl_->AsyncPollWrite(h, deadline);
+ }
+
+ void TTcpSocket::AsyncCancel() {
+ return Impl_->AsyncCancel();
+ }
+
+ size_t TTcpSocket::WriteSome(TContIOVector& d, TErrorCode& ec) noexcept {
+ return Impl_->WriteSome(d, ec);
+ }
+
+ size_t TTcpSocket::WriteSome(const void* buff, size_t size, TErrorCode& ec) noexcept {
+ return Impl_->WriteSome(buff, size, ec);
+ }
+
+ size_t TTcpSocket::ReadSome(void* buff, size_t size, TErrorCode& ec) noexcept {
+ return Impl_->ReadSome(buff, size, ec);
+ }
+
+ bool TTcpSocket::IsOpen() const noexcept {
+ return Native() != INVALID_SOCKET;
+ }
+
+ void TTcpSocket::Shutdown(TShutdownMode what, TErrorCode& ec) {
+ return Impl_->Shutdown(what, ec);
+ }
+
+ SOCKET TTcpSocket::Native() const noexcept {
+ return Impl_->Fd();
+ }
+
+ TEndpoint TTcpSocket::RemoteEndpoint() const {
+ return Impl_->RemoteEndpoint();
+ }
+
+ //////////////////////////////////
+
+ TTcpAcceptor::TTcpAcceptor(TIOService& srv) noexcept
+ : Srv_(srv)
+ , Impl_(new TImpl(srv.GetImpl()))
+ {
+ }
+
+ TTcpAcceptor::~TTcpAcceptor() {
+ }
+
+ void TTcpAcceptor::Bind(TEndpoint& ep, TErrorCode& ec) noexcept {
+ return Impl_->Bind(ep, ec);
+ }
+
+ void TTcpAcceptor::Listen(int backlog, TErrorCode& ec) noexcept {
+ return Impl_->Listen(backlog, ec);
+ }
+
+ void TTcpAcceptor::AsyncAccept(TTcpSocket& s, TTcpAcceptor::TAcceptHandler h, TDeadline deadline) {
+ return Impl_->AsyncAccept(s, h, deadline);
+ }
+
+ void TTcpAcceptor::AsyncCancel() {
+ Impl_->AsyncCancel();
+ }
+
+}