Skip to content

Commit b348525

Browse files
committed
Client: introduce stream
Implement Stream class instead of NetWorkEngine class. Stream class encapsulates network connection with simple API: connect, close, send, recv. It also has status that show blocking state of I/O. There must be no logical changes in this patch. Part of #28
1 parent 259a059 commit b348525

14 files changed

+1059
-510
lines changed

examples/Simple.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ int WAIT_TIMEOUT = 1000; //milliseconds
5555
//doclabel02-1
5656
using Buf_t = tnt::Buffer<16 * 1024>;
5757
#include "../src/Client/LibevNetProvider.hpp"
58-
using Net_t = LibevNetProvider<Buf_t, NetworkEngine>;
58+
using Net_t = LibevNetProvider<Buf_t, DefaultStream>;
5959
//doclabel02-2
6060

6161
//doclabel16-1

src/Client/Connection.hpp

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "RequestEncoder.hpp"
3434
#include "ResponseDecoder.hpp"
35+
#include "Stream.hpp"
3536
#include "../Utils/Logger.hpp"
3637

3738
#include <sys/uio.h> //iovec
@@ -80,7 +81,8 @@ struct ConnectionImpl
8081
ResponseDecoder<BUFFER> dec;
8182
/* Iterator separating decoded and raw data in input buffer. */
8283
iterator endDecoded;
83-
int socket;
84+
/* Network layer of the connection. */
85+
typename NetProvider::Stream_t strm;
8486
//Several connection wrappers may point to the same implementation.
8587
//It is useful to store connection objects in stl containers for example.
8688
ssize_t refs;
@@ -94,18 +96,17 @@ struct ConnectionImpl
9496
template<class BUFFER, class NetProvider>
9597
ConnectionImpl<BUFFER, NetProvider>::ConnectionImpl(Connector<BUFFER, NetProvider> &conn) :
9698
connector(conn), inBuf(), outBuf(), enc(outBuf), dec(inBuf),
97-
endDecoded(inBuf.begin()), socket(-1), refs(0)
99+
endDecoded(inBuf.begin()), refs(0)
98100
{
99101
}
100102

101103
template<class BUFFER, class NetProvider>
102104
ConnectionImpl<BUFFER, NetProvider>::~ConnectionImpl()
103105
{
104106
assert(refs == 0);
105-
if (socket >= 0) {
107+
if (!strm.has_status(SS_DEAD)) {
106108
Connection<BUFFER, NetProvider> conn(this);
107109
connector.close(conn);
108-
socket = -1;
109110
}
110111
}
111112

@@ -143,6 +144,9 @@ class Connection
143144

144145
Impl_t *getImpl() { return impl; }
145146

147+
typename NetProvider::Stream_t &get_strm() { return impl->strm; }
148+
const typename NetProvider::Stream_t &get_strm() const { return impl->strm; }
149+
146150
//Required for storing Connections in hash tables (std::unordered_map)
147151
friend bool operator == (const Connection<BUFFER, NetProvider>& lhs,
148152
const Connection<BUFFER, NetProvider>& rhs)
@@ -154,7 +158,8 @@ class Connection
154158
friend bool operator < (const Connection<BUFFER, NetProvider>& lhs,
155159
const Connection<BUFFER, NetProvider>& rhs)
156160
{
157-
return lhs.impl->socket < rhs.impl->socket;
161+
// TODO: remove dependency on socket.
162+
return lhs.get_strm().get_fd() < rhs.get_strm().get_fd();
158163
}
159164

160165
Response<BUFFER> getResponse(rid_t future);
@@ -169,8 +174,6 @@ class Connection
169174
void setError(const std::string &msg, int errno_ = 0);
170175
ConnectionError& getError();
171176
void reset();
172-
int getSocket() const;
173-
void setSocket(int socket);
174177
BUFFER& getInBuf();
175178
BUFFER& getOutBuf();
176179

@@ -416,20 +419,6 @@ Connection<BUFFER, NetProvider>::reset()
416419
impl->error = ConnectionError{};
417420
}
418421

419-
template<class BUFFER, class NetProvider>
420-
int
421-
Connection<BUFFER, NetProvider>::getSocket() const
422-
{
423-
return impl->socket;
424-
}
425-
426-
template<class BUFFER, class NetProvider>
427-
void
428-
Connection<BUFFER, NetProvider>::setSocket(int socket)
429-
{
430-
impl->socket = socket;
431-
}
432-
433422
template<class BUFFER, class NetProvider>
434423
BUFFER&
435424
Connection<BUFFER, NetProvider>::getInBuf()

src/Client/Connector.hpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,24 @@
3030
* SUCH DAMAGE.
3131
*/
3232
#include "Connection.hpp"
33-
#include "NetworkEngine.hpp"
33+
#include "UnixPlainStream.hpp"
3434
#include "../Utils/Timer.hpp"
3535

3636
#include <set>
3737

38+
using DefaultStream = UnixPlainStream;
39+
3840
/**
3941
* MacOS does not have epoll so let's use Libev as default network provider.
4042
*/
4143
#ifdef __linux__
4244
#include "EpollNetProvider.hpp"
4345
template<class BUFFER>
44-
using DefaultNetProvider = EpollNetProvider<BUFFER, NetworkEngine>;
46+
using DefaultNetProvider = EpollNetProvider<BUFFER, DefaultStream>;
4547
#else
4648
#include "LibevNetProvider.hpp"
4749
template<class BUFFER>
48-
using DefaultNetProvider = LibevNetProvider<BUFFER, NetworkEngine>;
50+
using DefaultNetProvider = LibevNetProvider<BUFFER, DefaultStream>;
4951
#endif
5052

5153
template<class BUFFER, class NetProvider = DefaultNetProvider<BUFFER>>
@@ -58,8 +60,7 @@ class Connector
5860
Connector& operator = (const Connector& connector) = delete;
5961
//////////////////////////////Main API//////////////////////////////////
6062
int connect(Connection<BUFFER, NetProvider> &conn,
61-
const std::string_view& addr, unsigned port,
62-
size_t timeout = DEFAULT_CONNECT_TIMEOUT);
63+
const std::string& addr, unsigned port);
6364

6465
int wait(Connection<BUFFER, NetProvider> &conn, rid_t future,
6566
int timeout = 0, Response<BUFFER> *result = nullptr);
@@ -76,8 +77,6 @@ class Connector
7677
std::set<Connection<BUFFER, NetProvider>> m_ReadyToSend;
7778
void close(Connection<BUFFER, NetProvider> &conn);
7879
private:
79-
//Timeout of Connector::connect() method.
80-
constexpr static size_t DEFAULT_CONNECT_TIMEOUT = 2;
8180
NetProvider m_NetProvider;
8281
std::set<Connection<BUFFER, NetProvider>> m_ReadyToDecode;
8382
};
@@ -95,12 +94,12 @@ Connector<BUFFER, NetProvider>::~Connector()
9594
template<class BUFFER, class NetProvider>
9695
int
9796
Connector<BUFFER, NetProvider>::connect(Connection<BUFFER, NetProvider> &conn,
98-
const std::string_view& addr,
99-
unsigned port, size_t timeout)
97+
const std::string& addr,
98+
unsigned port)
10099
{
101100
//Make sure that connection is not yet established.
102-
assert(conn.getSocket() < 0);
103-
if (m_NetProvider.connect(conn, addr, port, timeout) != 0) {
101+
assert(conn.get_strm().has_status(SS_DEAD));
102+
if (m_NetProvider.connect(conn, addr, port) != 0) {
104103
LOG_ERROR("Failed to connect to ", addr, ':', port);
105104
return -1;
106105
}
@@ -112,9 +111,8 @@ template<class BUFFER, class NetProvider>
112111
void
113112
Connector<BUFFER, NetProvider>::close(Connection<BUFFER, NetProvider> &conn)
114113
{
115-
assert(conn.getSocket() >= 0);
114+
assert(!conn.get_strm().has_status(SS_DEAD));
116115
m_NetProvider.close(conn);
117-
conn.setSocket(-1);
118116
}
119117

120118
template<class BUFFER, class NetProvider>

0 commit comments

Comments
 (0)