@@ -98,7 +98,8 @@ Promise<void> Udp::connect(const AddressHandle &address) {
98
98
Promise<void > Udp::send (std::span<char > buffer,
99
99
std::optional<AddressHandle> address) {
100
100
SendAwaiter_ sendAwaiter{};
101
- uv_udp_send_t req;
101
+ uv_udp_send_t req{};
102
+ BOOST_ASSERT (uv_req_get_data ((uv_req_t *)&req) == nullptr );
102
103
uv_req_set_data ((uv_req_t *)&req, &sendAwaiter);
103
104
104
105
std::array<uv_buf_t , 1 > bufs{};
@@ -115,14 +116,18 @@ Promise<void> Udp::send(std::span<char> buffer,
115
116
const uv_status status =
116
117
uv_udp_send (&req, udp_.get (), bufs.begin (), 1 , addr, onSendDone);
117
118
if (status != 0 ) {
119
+ uv_req_set_data ((uv_req_t *)&req, nullptr );
118
120
throw UvcoException{status, " uv_udp_send() failed immediately" };
119
121
}
120
122
121
123
const uv_status status_done = co_await sendAwaiter;
122
124
if (status_done != 0 ) {
125
+ uv_req_set_data ((uv_req_t *)&req, nullptr );
123
126
throw UvcoException{status_done, " uv_udp_send() failed while sending" };
124
127
}
125
128
129
+ uv_req_set_data ((uv_req_t *)&req, nullptr );
130
+
126
131
co_return ;
127
132
}
128
133
@@ -133,9 +138,11 @@ Promise<std::string> Udp::receiveOne() {
133
138
134
139
Promise<std::pair<std::string, AddressHandle>> Udp::receiveOneFrom () {
135
140
RecvAwaiter_ awaiter{};
136
- udp_->data = &awaiter;
141
+ BOOST_ASSERT (uv_handle_get_data ((uv_handle_t *)udp_.get ()) == nullptr );
142
+ uv_handle_set_data ((uv_handle_t *)udp_.get (), &awaiter);
137
143
const uv_status status = udpStartReceive ();
138
144
if (status != 0 ) {
145
+ uv_handle_set_data ((uv_handle_t *)udp_.get (), nullptr );
139
146
throw UvcoException (status, " uv_udp_recv_start()" );
140
147
}
141
148
@@ -144,19 +151,19 @@ Promise<std::pair<std::string, AddressHandle>> Udp::receiveOneFrom() {
144
151
co_await awaiter;
145
152
146
153
// Any exceptions are thrown in RecvAwaiter_::await_resume
147
- udp_-> data = nullptr ;
154
+ uv_handle_set_data (( uv_handle_t *) udp_. get (), nullptr ) ;
148
155
co_return std::move (packet.value ());
149
156
}
150
157
151
158
MultiPromise<std::pair<std::string, AddressHandle>> Udp::receiveMany () {
152
- FlagGuard receivingGuard{is_receiving_};
153
-
154
159
RecvAwaiter_ awaiter{};
155
160
awaiter.stop_receiving_ = false ;
156
- udp_->data = &awaiter;
161
+ BOOST_ASSERT (uv_handle_get_data ((uv_handle_t *)udp_.get ()) == nullptr );
162
+ uv_handle_set_data ((uv_handle_t *)udp_.get (), &awaiter);
157
163
158
164
const uv_status status = udpStartReceive ();
159
165
if (status != 0 ) {
166
+ uv_handle_set_data ((uv_handle_t *)udp_.get (), nullptr );
160
167
throw UvcoException (status, " receiveMany(): uv_udp_recv_start()" );
161
168
}
162
169
@@ -169,11 +176,12 @@ MultiPromise<std::pair<std::string, AddressHandle>> Udp::receiveMany() {
169
176
}
170
177
// It's possible that co_yield doesn't resume anymore, therefore clear
171
178
// reference to local awaiter.
172
- udp_-> data = nullptr ;
179
+ uv_handle_set_data (( uv_handle_t *) udp_. get (), nullptr ) ;
173
180
co_yield std::move (buffer.value ());
174
- udp_->data = &awaiter;
181
+ BOOST_ASSERT (uv_handle_get_data ((uv_handle_t *)udp_.get ()) == nullptr );
182
+ uv_handle_set_data ((uv_handle_t *)udp_.get (), &awaiter);
175
183
}
176
- udp_-> data = nullptr ;
184
+ uv_handle_set_data (( uv_handle_t *) udp_. get (), nullptr ) ;
177
185
udpStopReceive ();
178
186
co_return ;
179
187
}
0 commit comments