Skip to content

Commit 8dd1539

Browse files
committed
qml protocols: performance optimizations; implement new other kinds of framing found in the wild
1 parent 7ef3af7 commit 8dd1539

25 files changed

+1639
-226
lines changed

src/ossia-qt/protocols/qml_tcp_inbound_socket.hpp

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
#include <ossia/detail/variant.hpp>
33
#include <ossia/network/context.hpp>
44
#include <ossia/network/sockets/configuration.hpp>
5+
#include <ossia/network/sockets/cobs_framing.hpp>
6+
#include <ossia/network/sockets/fixed_length_framing.hpp>
57
#include <ossia/network/sockets/line_framing.hpp>
68
#include <ossia/network/sockets/no_framing.hpp>
79
#include <ossia/network/sockets/size_prefix_framing.hpp>
810
#include <ossia/network/sockets/slip_framing.hpp>
11+
#include <ossia/network/sockets/stx_etx_framing.hpp>
912
#include <ossia/network/sockets/tcp_socket.hpp>
13+
#include <ossia/network/sockets/var_size_prefix_framing.hpp>
1014

1115
#include <ossia-qt/protocols/utils.hpp>
1216

@@ -31,7 +35,14 @@ class qml_tcp_connection
3135
ossia::net::no_framing::decoder<socket_t>,
3236
ossia::net::slip_decoder<socket_t>,
3337
ossia::net::size_prefix_decoder<socket_t>,
34-
ossia::net::line_framing_decoder<socket_t>>;
38+
ossia::net::line_framing_decoder<socket_t>,
39+
ossia::net::cobs_decoder<socket_t>,
40+
ossia::net::stx_etx_framing::decoder<socket_t>,
41+
ossia::net::size_prefix_1byte_framing::decoder<socket_t>,
42+
ossia::net::size_prefix_2byte_be_framing::decoder<socket_t>,
43+
ossia::net::size_prefix_2byte_le_framing::decoder<socket_t>,
44+
ossia::net::size_prefix_4byte_le_framing::decoder<socket_t>,
45+
ossia::net::fixed_length_decoder<socket_t>>;
3546

3647
struct state
3748
{
@@ -75,6 +86,29 @@ class qml_tcp_connection
7586
std::copy_n(line_delimiter, 8, dec.delimiter);
7687
}
7788
break;
89+
case ossia::net::framing::cobs:
90+
decoder.template emplace<4>(listener.m_socket);
91+
break;
92+
case ossia::net::framing::stx_etx:
93+
decoder.template emplace<5>(listener.m_socket);
94+
break;
95+
case ossia::net::framing::size_prefix_1byte:
96+
decoder.template emplace<6>(listener.m_socket);
97+
break;
98+
case ossia::net::framing::size_prefix_2byte_be:
99+
decoder.template emplace<7>(listener.m_socket);
100+
break;
101+
case ossia::net::framing::size_prefix_2byte_le:
102+
decoder.template emplace<8>(listener.m_socket);
103+
break;
104+
case ossia::net::framing::size_prefix_4byte_le:
105+
decoder.template emplace<9>(listener.m_socket);
106+
break;
107+
case ossia::net::framing::fixed_length:
108+
decoder.template emplace<10>(listener.m_socket);
109+
if(!delim.empty())
110+
ossia::get<10>(decoder).frame_size = std::stoul(delim);
111+
break;
78112
}
79113
}
80114

@@ -86,22 +120,44 @@ class qml_tcp_connection
86120
case ossia::net::framing::none:
87121
listener.write(boost::asio::const_buffer(data, sz));
88122
break;
89-
case ossia::net::framing::slip: {
90-
ossia::net::slip_encoder<socket_t> enc{listener.m_socket};
91-
enc.write(data, sz);
123+
case ossia::net::framing::slip:
124+
ossia::net::slip_encoder<socket_t>{listener.m_socket}.write(data, sz);
92125
break;
93-
}
94-
case ossia::net::framing::size_prefix: {
95-
ossia::net::size_prefix_encoder<socket_t> enc{listener.m_socket};
96-
enc.write(data, sz);
126+
case ossia::net::framing::size_prefix:
127+
ossia::net::size_prefix_encoder<socket_t>{listener.m_socket}.write(data, sz);
97128
break;
98-
}
99129
case ossia::net::framing::line_delimiter: {
100130
ossia::net::line_framing_encoder<socket_t> enc{listener.m_socket};
101131
std::copy_n(line_delimiter, 8, enc.delimiter);
102132
enc.write(data, sz);
103133
break;
104134
}
135+
case ossia::net::framing::cobs:
136+
ossia::net::cobs_encoder<socket_t>{listener.m_socket}.write(data, sz);
137+
break;
138+
case ossia::net::framing::stx_etx:
139+
ossia::net::stx_etx_framing::encoder<socket_t>{listener.m_socket}.write(
140+
data, sz);
141+
break;
142+
case ossia::net::framing::size_prefix_1byte:
143+
ossia::net::size_prefix_1byte_framing::encoder<socket_t>{listener.m_socket}
144+
.write(data, sz);
145+
break;
146+
case ossia::net::framing::size_prefix_2byte_be:
147+
ossia::net::size_prefix_2byte_be_framing::encoder<socket_t>{listener.m_socket}
148+
.write(data, sz);
149+
break;
150+
case ossia::net::framing::size_prefix_2byte_le:
151+
ossia::net::size_prefix_2byte_le_framing::encoder<socket_t>{listener.m_socket}
152+
.write(data, sz);
153+
break;
154+
case ossia::net::framing::size_prefix_4byte_le:
155+
ossia::net::size_prefix_4byte_le_framing::encoder<socket_t>{listener.m_socket}
156+
.write(data, sz);
157+
break;
158+
case ossia::net::framing::fixed_length:
159+
ossia::net::fixed_length_encoder<socket_t>{listener.m_socket}.write(data, sz);
160+
break;
105161
}
106162
}
107163
};
@@ -176,7 +232,7 @@ class qml_tcp_connection
176232
if(!m_state)
177233
return;
178234
auto st = m_state;
179-
boost::asio::dispatch(st->context, [st, buffer] {
235+
boost::asio::dispatch(st->context, [st, buffer = std::move(buffer)] {
180236
if(st->alive)
181237
st->write_encoded(buffer.data(), buffer.size());
182238
});

src/ossia-qt/protocols/qml_tcp_outbound_socket.hpp

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
#include <ossia/detail/variant.hpp>
33
#include <ossia/network/context.hpp>
44
#include <ossia/network/sockets/configuration.hpp>
5+
#include <ossia/network/sockets/cobs_framing.hpp>
6+
#include <ossia/network/sockets/fixed_length_framing.hpp>
57
#include <ossia/network/sockets/line_framing.hpp>
68
#include <ossia/network/sockets/no_framing.hpp>
79
#include <ossia/network/sockets/size_prefix_framing.hpp>
810
#include <ossia/network/sockets/slip_framing.hpp>
11+
#include <ossia/network/sockets/stx_etx_framing.hpp>
912
#include <ossia/network/sockets/tcp_socket.hpp>
13+
#include <ossia/network/sockets/var_size_prefix_framing.hpp>
1014

1115
#include <ossia-qt/protocols/utils.hpp>
1216

@@ -31,7 +35,14 @@ class qml_tcp_outbound_socket
3135
ossia::net::no_framing::decoder<socket_t>,
3236
ossia::net::slip_decoder<socket_t>,
3337
ossia::net::size_prefix_decoder<socket_t>,
34-
ossia::net::line_framing_decoder<socket_t>>;
38+
ossia::net::line_framing_decoder<socket_t>,
39+
ossia::net::cobs_decoder<socket_t>,
40+
ossia::net::stx_etx_framing::decoder<socket_t>,
41+
ossia::net::size_prefix_1byte_framing::decoder<socket_t>,
42+
ossia::net::size_prefix_2byte_be_framing::decoder<socket_t>,
43+
ossia::net::size_prefix_2byte_le_framing::decoder<socket_t>,
44+
ossia::net::size_prefix_4byte_le_framing::decoder<socket_t>,
45+
ossia::net::fixed_length_decoder<socket_t>>;
3546

3647
struct state
3748
{
@@ -74,6 +85,29 @@ class qml_tcp_outbound_socket
7485
std::copy_n(line_delimiter, 8, dec.delimiter);
7586
}
7687
break;
88+
case ossia::net::framing::cobs:
89+
decoder.template emplace<4>(socket.m_socket);
90+
break;
91+
case ossia::net::framing::stx_etx:
92+
decoder.template emplace<5>(socket.m_socket);
93+
break;
94+
case ossia::net::framing::size_prefix_1byte:
95+
decoder.template emplace<6>(socket.m_socket);
96+
break;
97+
case ossia::net::framing::size_prefix_2byte_be:
98+
decoder.template emplace<7>(socket.m_socket);
99+
break;
100+
case ossia::net::framing::size_prefix_2byte_le:
101+
decoder.template emplace<8>(socket.m_socket);
102+
break;
103+
case ossia::net::framing::size_prefix_4byte_le:
104+
decoder.template emplace<9>(socket.m_socket);
105+
break;
106+
case ossia::net::framing::fixed_length:
107+
decoder.template emplace<10>(socket.m_socket);
108+
if(!delim.empty())
109+
ossia::get<10>(decoder).frame_size = std::stoul(delim);
110+
break;
77111
}
78112
}
79113

@@ -85,22 +119,43 @@ class qml_tcp_outbound_socket
85119
case ossia::net::framing::none:
86120
socket.write(data, sz);
87121
break;
88-
case ossia::net::framing::slip: {
89-
ossia::net::slip_encoder<socket_t> enc{socket.m_socket};
90-
enc.write(data, sz);
122+
case ossia::net::framing::slip:
123+
ossia::net::slip_encoder<socket_t>{socket.m_socket}.write(data, sz);
91124
break;
92-
}
93-
case ossia::net::framing::size_prefix: {
94-
ossia::net::size_prefix_encoder<socket_t> enc{socket.m_socket};
95-
enc.write(data, sz);
125+
case ossia::net::framing::size_prefix:
126+
ossia::net::size_prefix_encoder<socket_t>{socket.m_socket}.write(data, sz);
96127
break;
97-
}
98128
case ossia::net::framing::line_delimiter: {
99129
ossia::net::line_framing_encoder<socket_t> enc{socket.m_socket};
100130
std::copy_n(line_delimiter, 8, enc.delimiter);
101131
enc.write(data, sz);
102132
break;
103133
}
134+
case ossia::net::framing::cobs:
135+
ossia::net::cobs_encoder<socket_t>{socket.m_socket}.write(data, sz);
136+
break;
137+
case ossia::net::framing::stx_etx:
138+
ossia::net::stx_etx_framing::encoder<socket_t>{socket.m_socket}.write(data, sz);
139+
break;
140+
case ossia::net::framing::size_prefix_1byte:
141+
ossia::net::size_prefix_1byte_framing::encoder<socket_t>{socket.m_socket}.write(
142+
data, sz);
143+
break;
144+
case ossia::net::framing::size_prefix_2byte_be:
145+
ossia::net::size_prefix_2byte_be_framing::encoder<socket_t>{socket.m_socket}
146+
.write(data, sz);
147+
break;
148+
case ossia::net::framing::size_prefix_2byte_le:
149+
ossia::net::size_prefix_2byte_le_framing::encoder<socket_t>{socket.m_socket}
150+
.write(data, sz);
151+
break;
152+
case ossia::net::framing::size_prefix_4byte_le:
153+
ossia::net::size_prefix_4byte_le_framing::encoder<socket_t>{socket.m_socket}
154+
.write(data, sz);
155+
break;
156+
case ossia::net::framing::fixed_length:
157+
ossia::net::fixed_length_encoder<socket_t>{socket.m_socket}.write(data, sz);
158+
break;
104159
}
105160
}
106161
};
@@ -187,7 +242,7 @@ class qml_tcp_outbound_socket
187242
if(!m_state)
188243
return;
189244
auto st = m_state;
190-
boost::asio::dispatch(st->socket.m_context, [st, buffer] {
245+
boost::asio::dispatch(st->socket.m_context, [st, buffer = std::move(buffer)] {
191246
if(st->alive)
192247
st->write_encoded(buffer.data(), buffer.size());
193248
});

src/ossia-qt/protocols/qml_udp_inbound_socket.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,15 @@ class qml_udp_inbound_socket
125125
return;
126126

127127
// Update cached sender object (Qt thread, no race)
128-
self->m_sender.m_endpoint = sender_ep;
128+
// Only rebuild host string if endpoint changed
129+
if(self->m_sender.m_endpoint != sender_ep)
130+
{
131+
self->m_sender.m_endpoint = sender_ep;
132+
self->m_sender.m_host
133+
= QString::fromStdString(sender_ep.address().to_string());
134+
self->m_sender.m_port = sender_ep.port();
135+
}
129136
self->m_sender.m_state = st;
130-
self->m_sender.m_host
131-
= QString::fromStdString(sender_ep.address().to_string());
132-
self->m_sender.m_port = sender_ep.port();
133137

134138
if(self->onMessage.isCallable())
135139
{

src/ossia-qt/protocols/qml_udp_outbound_socket.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class qml_udp_outbound_socket
9999
if(!m_state)
100100
return;
101101
auto st = m_state;
102-
boost::asio::dispatch(st->socket.m_context, [st, buffer] {
102+
boost::asio::dispatch(st->socket.m_context, [st, buffer = std::move(buffer)] {
103103
if(st->alive)
104104
st->socket.write(buffer.data(), buffer.size());
105105
});

src/ossia-qt/protocols/qml_unix_inbound_socket.hpp

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
#if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
44
#include <ossia/detail/variant.hpp>
55
#include <ossia/network/sockets/configuration.hpp>
6+
#include <ossia/network/sockets/cobs_framing.hpp>
7+
#include <ossia/network/sockets/fixed_length_framing.hpp>
68
#include <ossia/network/sockets/line_framing.hpp>
79
#include <ossia/network/sockets/no_framing.hpp>
810
#include <ossia/network/sockets/size_prefix_framing.hpp>
911
#include <ossia/network/sockets/slip_framing.hpp>
12+
#include <ossia/network/sockets/stx_etx_framing.hpp>
1013
#include <ossia/network/sockets/unix_socket.hpp>
14+
#include <ossia/network/sockets/var_size_prefix_framing.hpp>
1115

1216
#include <ossia-qt/protocols/utils.hpp>
1317

@@ -129,7 +133,14 @@ class qml_unix_stream_connection
129133
ossia::net::no_framing::decoder<socket_t>,
130134
ossia::net::slip_decoder<socket_t>,
131135
ossia::net::size_prefix_decoder<socket_t>,
132-
ossia::net::line_framing_decoder<socket_t>>;
136+
ossia::net::line_framing_decoder<socket_t>,
137+
ossia::net::cobs_decoder<socket_t>,
138+
ossia::net::stx_etx_framing::decoder<socket_t>,
139+
ossia::net::size_prefix_1byte_framing::decoder<socket_t>,
140+
ossia::net::size_prefix_2byte_be_framing::decoder<socket_t>,
141+
ossia::net::size_prefix_2byte_le_framing::decoder<socket_t>,
142+
ossia::net::size_prefix_4byte_le_framing::decoder<socket_t>,
143+
ossia::net::fixed_length_decoder<socket_t>>;
133144

134145
struct state
135146
{
@@ -172,6 +183,29 @@ class qml_unix_stream_connection
172183
std::copy_n(line_delimiter, 8, dec.delimiter);
173184
}
174185
break;
186+
case ossia::net::framing::cobs:
187+
decoder.template emplace<4>(listener.m_socket);
188+
break;
189+
case ossia::net::framing::stx_etx:
190+
decoder.template emplace<5>(listener.m_socket);
191+
break;
192+
case ossia::net::framing::size_prefix_1byte:
193+
decoder.template emplace<6>(listener.m_socket);
194+
break;
195+
case ossia::net::framing::size_prefix_2byte_be:
196+
decoder.template emplace<7>(listener.m_socket);
197+
break;
198+
case ossia::net::framing::size_prefix_2byte_le:
199+
decoder.template emplace<8>(listener.m_socket);
200+
break;
201+
case ossia::net::framing::size_prefix_4byte_le:
202+
decoder.template emplace<9>(listener.m_socket);
203+
break;
204+
case ossia::net::framing::fixed_length:
205+
decoder.template emplace<10>(listener.m_socket);
206+
if(!delim.empty())
207+
ossia::get<10>(decoder).frame_size = std::stoul(delim);
208+
break;
175209
}
176210
}
177211

@@ -183,22 +217,44 @@ class qml_unix_stream_connection
183217
case ossia::net::framing::none:
184218
listener.write(boost::asio::const_buffer(data, sz));
185219
break;
186-
case ossia::net::framing::slip: {
187-
ossia::net::slip_encoder<socket_t> enc{listener.m_socket};
188-
enc.write(data, sz);
220+
case ossia::net::framing::slip:
221+
ossia::net::slip_encoder<socket_t>{listener.m_socket}.write(data, sz);
189222
break;
190-
}
191-
case ossia::net::framing::size_prefix: {
192-
ossia::net::size_prefix_encoder<socket_t> enc{listener.m_socket};
193-
enc.write(data, sz);
223+
case ossia::net::framing::size_prefix:
224+
ossia::net::size_prefix_encoder<socket_t>{listener.m_socket}.write(data, sz);
194225
break;
195-
}
196226
case ossia::net::framing::line_delimiter: {
197227
ossia::net::line_framing_encoder<socket_t> enc{listener.m_socket};
198228
std::copy_n(line_delimiter, 8, enc.delimiter);
199229
enc.write(data, sz);
200230
break;
201231
}
232+
case ossia::net::framing::cobs:
233+
ossia::net::cobs_encoder<socket_t>{listener.m_socket}.write(data, sz);
234+
break;
235+
case ossia::net::framing::stx_etx:
236+
ossia::net::stx_etx_framing::encoder<socket_t>{listener.m_socket}.write(
237+
data, sz);
238+
break;
239+
case ossia::net::framing::size_prefix_1byte:
240+
ossia::net::size_prefix_1byte_framing::encoder<socket_t>{listener.m_socket}
241+
.write(data, sz);
242+
break;
243+
case ossia::net::framing::size_prefix_2byte_be:
244+
ossia::net::size_prefix_2byte_be_framing::encoder<socket_t>{listener.m_socket}
245+
.write(data, sz);
246+
break;
247+
case ossia::net::framing::size_prefix_2byte_le:
248+
ossia::net::size_prefix_2byte_le_framing::encoder<socket_t>{listener.m_socket}
249+
.write(data, sz);
250+
break;
251+
case ossia::net::framing::size_prefix_4byte_le:
252+
ossia::net::size_prefix_4byte_le_framing::encoder<socket_t>{listener.m_socket}
253+
.write(data, sz);
254+
break;
255+
case ossia::net::framing::fixed_length:
256+
ossia::net::fixed_length_encoder<socket_t>{listener.m_socket}.write(data, sz);
257+
break;
202258
}
203259
}
204260
};
@@ -262,7 +318,7 @@ class qml_unix_stream_connection
262318
if(!m_state)
263319
return;
264320
auto st = m_state;
265-
boost::asio::dispatch(st->context, [st, buffer] {
321+
boost::asio::dispatch(st->context, [st, buffer = std::move(buffer)] {
266322
if(st->alive)
267323
st->write_encoded(buffer.data(), buffer.size());
268324
});

0 commit comments

Comments
 (0)