@@ -181,88 +181,90 @@ pub fn connect(input_ip: ip::IpAddr, port: uint,
181
181
debug ! ( "stream_handle_ptr outside interact %?" ,
182
182
stream_handle_ptr) ;
183
183
do iotask:: interact ( iotask) |loop_ptr| {
184
- debug ! ( "in interact cb for tcp client connect.." ) ;
185
- debug ! ( "stream_handle_ptr in interact %?" ,
186
- stream_handle_ptr) ;
187
- match uv:: ll:: tcp_init ( loop_ptr, stream_handle_ptr) {
188
- 0i32 => {
189
- debug ! ( "tcp_init successful" ) ;
190
- debug ! ( "dealing w/ ipv4 connection.." ) ;
191
- let connect_req_ptr: * uv:: ll:: uv_connect_t =
192
- & ( * socket_data_ptr) . connect_req ;
193
- let addr_str = ip:: format_addr ( & input_ip) ;
194
- let connect_result = match input_ip {
195
- ip:: Ipv4 ( ref addr) => {
196
- // have to "recreate" the
197
- // sockaddr_in/6 since the ip_addr
198
- // discards the port info.. should
199
- // probably add an additional rust
200
- // type that actually is closer to
201
- // what the libuv API expects (ip str
202
- // + port num)
203
- debug ! ( "addr: %?" , addr) ;
204
- let in_addr = uv:: ll:: ip4_addr ( addr_str,
205
- port as int ) ;
206
- uv:: ll:: tcp_connect (
207
- connect_req_ptr,
208
- stream_handle_ptr,
209
- & in_addr,
210
- tcp_connect_on_connect_cb)
211
- }
212
- ip:: Ipv6 ( ref addr) => {
213
- debug ! ( "addr: %?" , addr) ;
214
- let in_addr = uv:: ll:: ip6_addr ( addr_str,
215
- port as int ) ;
216
- uv:: ll:: tcp_connect6 (
217
- connect_req_ptr,
218
- stream_handle_ptr,
219
- & in_addr,
220
- tcp_connect_on_connect_cb)
221
- }
222
- } ;
223
- match connect_result {
224
- 0i32 => {
225
- debug ! ( "tcp_connect successful: \
226
- stream %x,
227
- socket data %x" ,
228
- stream_handle_ptr as uint,
229
- socket_data_ptr as uint) ;
230
- // reusable data that we'll have for the
231
- // duration..
232
- uv:: ll:: set_data_for_uv_handle (
233
- stream_handle_ptr,
234
- socket_data_ptr as
235
- * libc:: c_void ) ;
236
- // just so the connect_cb can send the
237
- // outcome..
238
- uv:: ll:: set_data_for_req ( connect_req_ptr,
239
- conn_data_ptr) ;
240
- debug ! ( "leaving tcp_connect interact cb..." ) ;
241
- // let tcp_connect_on_connect_cb send on
242
- // the result_ch, now..
243
- }
244
- _ => {
245
- // immediate connect
246
- // failure.. probably a garbage ip or
247
- // somesuch
248
- let err_data =
249
- uv:: ll:: get_last_err_data ( loop_ptr) ;
250
- let result_ch = ( * conn_data_ptr)
251
- . result_ch . clone ( ) ;
252
- result_ch. send ( ConnFailure ( err_data) ) ;
253
- uv:: ll:: set_data_for_uv_handle (
254
- stream_handle_ptr,
255
- conn_data_ptr) ;
256
- uv:: ll:: close ( stream_handle_ptr,
257
- stream_error_close_cb) ;
184
+ unsafe {
185
+ debug ! ( "in interact cb for tcp client connect.." ) ;
186
+ debug ! ( "stream_handle_ptr in interact %?" ,
187
+ stream_handle_ptr) ;
188
+ match uv:: ll:: tcp_init ( loop_ptr, stream_handle_ptr) {
189
+ 0i32 => {
190
+ debug ! ( "tcp_init successful" ) ;
191
+ debug ! ( "dealing w/ ipv4 connection.." ) ;
192
+ let connect_req_ptr: * uv:: ll:: uv_connect_t =
193
+ & ( * socket_data_ptr) . connect_req ;
194
+ let addr_str = ip:: format_addr ( & input_ip) ;
195
+ let connect_result = match input_ip {
196
+ ip:: Ipv4 ( ref addr) => {
197
+ // have to "recreate" the
198
+ // sockaddr_in/6 since the ip_addr
199
+ // discards the port info.. should
200
+ // probably add an additional rust
201
+ // type that actually is closer to
202
+ // what the libuv API expects (ip str
203
+ // + port num)
204
+ debug ! ( "addr: %?" , addr) ;
205
+ let in_addr = uv:: ll:: ip4_addr ( addr_str,
206
+ port as int ) ;
207
+ uv:: ll:: tcp_connect (
208
+ connect_req_ptr,
209
+ stream_handle_ptr,
210
+ & in_addr,
211
+ tcp_connect_on_connect_cb)
212
+ }
213
+ ip:: Ipv6 ( ref addr) => {
214
+ debug ! ( "addr: %?" , addr) ;
215
+ let in_addr = uv:: ll:: ip6_addr ( addr_str,
216
+ port as int ) ;
217
+ uv:: ll:: tcp_connect6 (
218
+ connect_req_ptr,
219
+ stream_handle_ptr,
220
+ & in_addr,
221
+ tcp_connect_on_connect_cb)
222
+ }
223
+ } ;
224
+ match connect_result {
225
+ 0i32 => {
226
+ debug ! ( "tcp_connect successful: \
227
+ stream %x,
228
+ socket data %x" ,
229
+ stream_handle_ptr as uint,
230
+ socket_data_ptr as uint) ;
231
+ // reusable data that we'll have for the
232
+ // duration..
233
+ uv:: ll:: set_data_for_uv_handle (
234
+ stream_handle_ptr,
235
+ socket_data_ptr as
236
+ * libc:: c_void ) ;
237
+ // just so the connect_cb can send the
238
+ // outcome..
239
+ uv:: ll:: set_data_for_req ( connect_req_ptr,
240
+ conn_data_ptr) ;
241
+ debug ! ( "leaving tcp_connect interact cb..." ) ;
242
+ // let tcp_connect_on_connect_cb send on
243
+ // the result_ch, now..
244
+ }
245
+ _ => {
246
+ // immediate connect
247
+ // failure.. probably a garbage ip or
248
+ // somesuch
249
+ let err_data =
250
+ uv:: ll:: get_last_err_data ( loop_ptr) ;
251
+ let result_ch = ( * conn_data_ptr)
252
+ . result_ch . clone ( ) ;
253
+ result_ch. send ( ConnFailure ( err_data) ) ;
254
+ uv:: ll:: set_data_for_uv_handle (
255
+ stream_handle_ptr,
256
+ conn_data_ptr) ;
257
+ uv:: ll:: close ( stream_handle_ptr,
258
+ stream_error_close_cb) ;
259
+ }
258
260
}
259
261
}
260
- }
261
- _ => {
262
- // failure to create a tcp handle
263
- let err_data = uv :: ll :: get_last_err_data ( loop_ptr ) ;
264
- let result_ch = ( * conn_data_ptr ) . result_ch . clone ( ) ;
265
- result_ch . send ( ConnFailure ( err_data ) ) ;
262
+ _ => {
263
+ // failure to create a tcp handle
264
+ let err_data = uv :: ll :: get_last_err_data ( loop_ptr ) ;
265
+ let result_ch = ( * conn_data_ptr ) . result_ch . clone ( ) ;
266
+ result_ch. send ( ConnFailure ( err_data ) ) ;
267
+ }
266
268
}
267
269
}
268
270
}
@@ -1013,12 +1015,14 @@ fn tear_down_socket_data(socket_data: @TcpSocketData) {
1013
1015
let close_data_ptr: * TcpSocketCloseData = & close_data;
1014
1016
let stream_handle_ptr = ( * socket_data) . stream_handle_ptr ;
1015
1017
do iotask:: interact ( & ( * socket_data) . iotask ) |loop_ptr| {
1016
- debug ! (
1017
- "interact dtor for tcp_socket stream %? loop %?" ,
1018
- stream_handle_ptr, loop_ptr) ;
1019
- uv:: ll:: set_data_for_uv_handle ( stream_handle_ptr,
1020
- close_data_ptr) ;
1021
- uv:: ll:: close ( stream_handle_ptr, tcp_socket_dtor_close_cb) ;
1018
+ unsafe {
1019
+ debug ! (
1020
+ "interact dtor for tcp_socket stream %? loop %?" ,
1021
+ stream_handle_ptr, loop_ptr) ;
1022
+ uv:: ll:: set_data_for_uv_handle ( stream_handle_ptr,
1023
+ close_data_ptr) ;
1024
+ uv:: ll:: close ( stream_handle_ptr, tcp_socket_dtor_close_cb) ;
1025
+ }
1022
1026
} ;
1023
1027
closed_po. recv ( ) ;
1024
1028
//the line below will most likely crash
@@ -1078,17 +1082,19 @@ fn read_stop_common_impl(socket_data: *TcpSocketData) ->
1078
1082
let stream_handle_ptr = ( * socket_data) . stream_handle_ptr ;
1079
1083
let ( stop_po, stop_ch) = stream :: < Option < TcpErrData > > ( ) ;
1080
1084
do iotask:: interact ( & ( * socket_data) . iotask ) |loop_ptr| {
1081
- debug ! ( "in interact cb for tcp::read_stop" ) ;
1082
- match uv:: ll:: read_stop ( stream_handle_ptr
1083
- as * uv:: ll:: uv_stream_t ) {
1084
- 0i32 => {
1085
- debug ! ( "successfully called uv_read_stop" ) ;
1086
- stop_ch. send ( None ) ;
1087
- }
1088
- _ => {
1089
- debug ! ( "failure in calling uv_read_stop" ) ;
1090
- let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1091
- stop_ch. send ( Some ( err_data. to_tcp_err ( ) ) ) ;
1085
+ unsafe {
1086
+ debug ! ( "in interact cb for tcp::read_stop" ) ;
1087
+ match uv:: ll:: read_stop ( stream_handle_ptr
1088
+ as * uv:: ll:: uv_stream_t ) {
1089
+ 0i32 => {
1090
+ debug ! ( "successfully called uv_read_stop" ) ;
1091
+ stop_ch. send ( None ) ;
1092
+ }
1093
+ _ => {
1094
+ debug ! ( "failure in calling uv_read_stop" ) ;
1095
+ let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1096
+ stop_ch. send ( Some ( err_data. to_tcp_err ( ) ) ) ;
1097
+ }
1092
1098
}
1093
1099
}
1094
1100
}
@@ -1108,20 +1114,22 @@ fn read_start_common_impl(socket_data: *TcpSocketData)
1108
1114
let ( start_po, start_ch) = stream :: < Option < uv:: ll:: uv_err_data > > ( ) ;
1109
1115
debug ! ( "in tcp::read_start before interact loop" ) ;
1110
1116
do iotask:: interact ( & ( * socket_data) . iotask ) |loop_ptr| {
1111
- debug ! ( "in tcp::read_start interact cb %?" ,
1112
- loop_ptr) ;
1113
- match uv:: ll:: read_start ( stream_handle_ptr
1114
- as * uv:: ll:: uv_stream_t ,
1115
- on_alloc_cb,
1116
- on_tcp_read_cb) {
1117
- 0i32 => {
1118
- debug ! ( "success doing uv_read_start" ) ;
1119
- start_ch. send ( None ) ;
1120
- }
1121
- _ => {
1122
- debug ! ( "error attempting uv_read_start" ) ;
1123
- let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1124
- start_ch. send ( Some ( err_data) ) ;
1117
+ unsafe {
1118
+ debug ! ( "in tcp::read_start interact cb %?" ,
1119
+ loop_ptr) ;
1120
+ match uv:: ll:: read_start ( stream_handle_ptr
1121
+ as * uv:: ll:: uv_stream_t ,
1122
+ on_alloc_cb,
1123
+ on_tcp_read_cb) {
1124
+ 0i32 => {
1125
+ debug ! ( "success doing uv_read_start" ) ;
1126
+ start_ch. send ( None ) ;
1127
+ }
1128
+ _ => {
1129
+ debug ! ( "error attempting uv_read_start" ) ;
1130
+ let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1131
+ start_ch. send ( Some ( err_data) ) ;
1132
+ }
1125
1133
}
1126
1134
}
1127
1135
}
@@ -1158,22 +1166,24 @@ fn write_common_impl(socket_data_ptr: *TcpSocketData,
1158
1166
} ;
1159
1167
let write_data_ptr: * WriteReqData = & write_data;
1160
1168
do iotask:: interact ( & ( * socket_data_ptr) . iotask ) |loop_ptr| {
1161
- debug ! ( "in interact cb for tcp::write %?" ,
1162
- loop_ptr) ;
1163
- match uv:: ll:: write ( write_req_ptr,
1164
- stream_handle_ptr,
1165
- write_buf_vec_ptr,
1166
- tcp_write_complete_cb) {
1167
- 0i32 => {
1168
- debug ! ( "uv_write() invoked successfully" ) ;
1169
- uv:: ll:: set_data_for_req ( write_req_ptr,
1170
- write_data_ptr) ;
1171
- }
1172
- _ => {
1173
- debug ! ( "error invoking uv_write()" ) ;
1174
- let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1175
- let result_ch = ( * write_data_ptr) . result_ch . clone ( ) ;
1176
- result_ch. send ( TcpWriteError ( err_data. to_tcp_err ( ) ) ) ;
1169
+ unsafe {
1170
+ debug ! ( "in interact cb for tcp::write %?" ,
1171
+ loop_ptr) ;
1172
+ match uv:: ll:: write ( write_req_ptr,
1173
+ stream_handle_ptr,
1174
+ write_buf_vec_ptr,
1175
+ tcp_write_complete_cb) {
1176
+ 0i32 => {
1177
+ debug ! ( "uv_write() invoked successfully" ) ;
1178
+ uv:: ll:: set_data_for_req ( write_req_ptr,
1179
+ write_data_ptr) ;
1180
+ }
1181
+ _ => {
1182
+ debug ! ( "error invoking uv_write()" ) ;
1183
+ let err_data = uv:: ll:: get_last_err_data ( loop_ptr) ;
1184
+ let result_ch = ( * write_data_ptr) . result_ch . clone ( ) ;
1185
+ result_ch. send ( TcpWriteError ( err_data. to_tcp_err ( ) ) ) ;
1186
+ }
1177
1187
}
1178
1188
}
1179
1189
}
0 commit comments