@@ -89,14 +89,17 @@ class Connector
89
89
std::set<Connection<BUFFER, NetProvider>> m_ReadyToSend;
90
90
void close (Connection<BUFFER, NetProvider> &conn);
91
91
void close (ConnectionImpl<BUFFER, NetProvider> &conn);
92
+
92
93
private:
93
94
/* *
94
95
* A helper to decode responses of a connection.
95
96
* Can be called when the connection is not ready to decode - it's just no-op.
97
+ * If `result` is not `nullptr`, it is used to return response for a request with
98
+ * `req_sync` sync. If `result` is `nullptr` - `req_sync` is ignored.
96
99
* Returns -1 in the case of any error, 0 on success.
97
100
*/
98
- int connectionDecodeResponses (Connection<BUFFER, NetProvider> &conn,
99
- Response<BUFFER> *result);
101
+ int connectionDecodeResponses (Connection<BUFFER, NetProvider> &conn, int req_sync, Response<BUFFER> *result);
102
+
100
103
private:
101
104
NetProvider m_NetProvider;
102
105
/* *
@@ -170,7 +173,7 @@ Connector<BUFFER, NetProvider>::close(ConnectionImpl<BUFFER, NetProvider> &conn)
170
173
171
174
template <class BUFFER , class NetProvider >
172
175
int
173
- Connector<BUFFER, NetProvider>::connectionDecodeResponses(Connection<BUFFER, NetProvider> &conn,
176
+ Connector<BUFFER, NetProvider>::connectionDecodeResponses(Connection<BUFFER, NetProvider> &conn, int req_sync,
174
177
Response<BUFFER> *result)
175
178
{
176
179
if (!hasDataToDecode (conn))
@@ -181,7 +184,7 @@ Connector<BUFFER, NetProvider>::connectionDecodeResponses(Connection<BUFFER, Net
181
184
182
185
int rc = 0 ;
183
186
while (hasDataToDecode (conn)) {
184
- DecodeStatus status = processResponse (conn, result);
187
+ DecodeStatus status = processResponse (conn, req_sync, result);
185
188
if (status == DECODE_ERR) {
186
189
rc = -1 ;
187
190
break ;
@@ -211,9 +214,10 @@ Connector<BUFFER, NetProvider>::wait(Connection<BUFFER, NetProvider> &conn,
211
214
Timer timer{timeout};
212
215
timer.start ();
213
216
static constexpr int INVALID_SYNC = -1 ;
217
+ int req_sync = static_cast <int >(future);
214
218
if (result != NULL )
215
219
result->header .sync = INVALID_SYNC;
216
- if (connectionDecodeResponses (conn, result) != 0 )
220
+ if (connectionDecodeResponses (conn, req_sync, result) != 0 )
217
221
return -1 ;
218
222
if (result != NULL && result->header .sync != INVALID_SYNC) {
219
223
LOG_DEBUG (" Future " , future, " is ready and decoded" );
@@ -225,7 +229,7 @@ Connector<BUFFER, NetProvider>::wait(Connection<BUFFER, NetProvider> &conn,
225
229
strerror (errno), errno);
226
230
return -1 ;
227
231
}
228
- if (connectionDecodeResponses (conn, result) != 0 )
232
+ if (connectionDecodeResponses (conn, req_sync, result) != 0 )
229
233
return -1 ;
230
234
if (result != NULL && result->header .sync != INVALID_SYNC) {
231
235
LOG_DEBUG (" Future " , future, " is ready and decoded" );
@@ -264,7 +268,7 @@ Connector<BUFFER, NetProvider>::waitAll(Connection<BUFFER, NetProvider> &conn,
264
268
strerror (errno), errno);
265
269
return -1 ;
266
270
}
267
- if (connectionDecodeResponses (conn, nullptr ) != 0 )
271
+ if (connectionDecodeResponses (conn, 0 , nullptr ) != 0 )
268
272
return -1 ;
269
273
bool finish = true ;
270
274
for (size_t i = last_not_ready; i < futures.size (); ++i) {
@@ -304,7 +308,7 @@ Connector<BUFFER, NetProvider>::waitAny(int timeout)
304
308
}
305
309
Connection<BUFFER, NetProvider> conn = *m_ReadyToDecode.begin ();
306
310
assert (hasDataToDecode (conn));
307
- if (connectionDecodeResponses (conn, nullptr ) != 0 )
311
+ if (connectionDecodeResponses (conn, 0 , nullptr ) != 0 )
308
312
return std::nullopt;
309
313
return conn;
310
314
}
@@ -323,7 +327,7 @@ Connector<BUFFER, NetProvider>::waitCount(Connection<BUFFER, NetProvider> &conn,
323
327
strerror (errno), errno);
324
328
return -1 ;
325
329
}
326
- if (connectionDecodeResponses (conn, nullptr ) != 0 )
330
+ if (connectionDecodeResponses (conn, 0 , nullptr ) != 0 )
327
331
return -1 ;
328
332
if ((conn.getFutureCount () - ready_futures) >= future_count)
329
333
return 0 ;
0 commit comments