@@ -83,16 +83,18 @@ Initiate a client connection over TCP/IP
83
83
84
84
# Arguments
85
85
86
- * ip - The IP address (versions 4 or 6) of the remote host
87
- * port - the unsigned integer of the desired remote host port
86
+ * `ip` - The IP address (versions 4 or 6) of the remote host
87
+ * `port` - the unsigned integer of the desired remote host port
88
+ * `hl_loop` - a `uv::hl::high_level_loop` that the tcp request will run on
88
89
89
90
# Returns
90
91
91
92
A `result` that, if the operation succeeds, contains a `tcp_socket` that
92
93
can be used to send and receive data to/from the remote host. In the event
93
94
of failure, a `tcp_err_data` will be returned
94
95
" ]
95
- fn connect ( input_ip : ip:: ip_addr , port : uint )
96
+ fn connect ( input_ip : ip:: ip_addr , port : uint ,
97
+ hl_loop : uv:: hl:: high_level_loop )
96
98
-> result:: result < tcp_socket , tcp_err_data > unsafe {
97
99
let result_po = comm:: port :: < conn_attempt > ( ) ;
98
100
let closed_signal_po = comm:: port :: < ( ) > ( ) ;
@@ -101,7 +103,6 @@ fn connect(input_ip: ip::ip_addr, port: uint)
101
103
closed_signal_ch: comm:: chan ( closed_signal_po)
102
104
} ;
103
105
let conn_data_ptr = ptr:: addr_of ( conn_data) ;
104
- let hl_loop = uv:: global_loop:: get ( ) ;
105
106
let reader_po = comm:: port :: < result:: result < [ u8 ] , tcp_err_data > > ( ) ;
106
107
let stream_handle_ptr = malloc_uv_tcp_t ( ) ;
107
108
* ( stream_handle_ptr as * mut uv:: ll:: uv_tcp_t ) = uv:: ll:: tcp_t ( ) ;
@@ -343,18 +344,19 @@ Bind to a given IP/port and listen for new connections
343
344
* `port` - a uint representing the port to listen on
344
345
* `backlog` - a uint representing the number of incoming connections
345
346
to cache in memory
347
+ * `hl_loop` - a `uv::hl::high_level_loop` that the tcp request will run on
346
348
347
349
# Returns
348
350
349
351
A `result` instance containing either a `tcp_conn_port` which can used
350
352
to listen for, and accept, new connections, or a `tcp_err_data` if
351
353
failure to create the tcp listener occurs
352
354
" ]
353
- fn new_listener ( host_ip : ip:: ip_addr , port : uint , backlog : uint )
355
+ fn new_listener ( host_ip : ip:: ip_addr , port : uint , backlog : uint ,
356
+ hl_loop : uv:: hl:: high_level_loop )
354
357
-> result:: result < tcp_conn_port , tcp_err_data > unsafe {
355
358
let stream_closed_po = comm:: port :: < ( ) > ( ) ;
356
359
let stream_closed_ch = comm:: chan ( stream_closed_po) ;
357
- let hl_loop = uv:: global_loop:: get ( ) ;
358
360
let new_conn_po = comm:: port :: < result:: result < * uv:: ll:: uv_tcp_t ,
359
361
tcp_err_data > > ( ) ;
360
362
let new_conn_ch = comm:: chan ( new_conn_po) ;
@@ -653,6 +655,7 @@ Bind to a given IP/port and listen for new connections
653
655
* `port` - a uint representing the port to listen on
654
656
* `backlog` - a uint representing the number of incoming connections
655
657
to cache in memory
658
+ * `hl_loop` - a `uv::hl::high_level_loop` that the tcp request will run on
656
659
* `on_establish_cb` - a callback that is evaluated if/when the listener
657
660
is successfully established. it takes no parameters
658
661
* `new_connect_cb` - a callback to be evaluated, on the libuv thread,
@@ -671,6 +674,7 @@ successful/normal shutdown, and a `tcp_err_data` record in the event
671
674
of listen exiting because of an error
672
675
" ]
673
676
fn listen_for_conn ( host_ip : ip:: ip_addr , port : uint , backlog : uint ,
677
+ hl_loop : uv:: hl:: high_level_loop ,
674
678
on_establish_cb : fn ~( comm:: chan < option < tcp_err_data > > ) ,
675
679
new_connect_cb : fn ~( tcp_new_connection ,
676
680
comm:: chan < option < tcp_err_data > > ) )
@@ -680,7 +684,6 @@ fn listen_for_conn(host_ip: ip::ip_addr, port: uint, backlog: uint,
680
684
let kill_ch = comm:: chan ( kill_po) ;
681
685
let server_stream = uv:: ll:: tcp_t ( ) ;
682
686
let server_stream_ptr = ptr:: addr_of ( server_stream) ;
683
- let hl_loop = uv:: global_loop:: get ( ) ;
684
687
let server_data = {
685
688
server_stream_ptr: server_stream_ptr,
686
689
stream_closed_ch: comm:: chan ( stream_closed_po) ,
@@ -804,8 +807,9 @@ impl sock_methods for tcp_socket {
804
807
805
808
// shared implementation for tcp::read
806
809
fn read_common_impl ( socket_data : * tcp_socket_data , timeout_msecs : uint )
807
- -> result:: result < [ u8 ] , tcp_err_data > {
810
+ -> result:: result < [ u8 ] , tcp_err_data > unsafe {
808
811
log ( debug, "starting tcp::read" ) ;
812
+ let hl_loop = ( * socket_data) . hl_loop ;
809
813
let rs_result = read_start_common_impl ( socket_data) ;
810
814
if result:: is_failure ( rs_result) {
811
815
let err_data = result:: get_err ( rs_result) ;
@@ -815,7 +819,7 @@ fn read_common_impl(socket_data: *tcp_socket_data, timeout_msecs: uint)
815
819
log ( debug, "tcp::read before recv_timeout" ) ;
816
820
let read_result = if timeout_msecs > 0 u {
817
821
timer:: recv_timeout (
818
- timeout_msecs, result:: get ( rs_result) )
822
+ hl_loop , timeout_msecs, result:: get ( rs_result) )
819
823
} else {
820
824
some ( comm:: recv ( result:: get ( rs_result) ) )
821
825
} ;
@@ -1270,7 +1274,7 @@ fn ipv4_ip_addr_to_sockaddr_in(input_ip: ip::ip_addr,
1270
1274
}
1271
1275
}
1272
1276
1273
- // #[cfg(test)]
1277
+ #[ cfg( test) ]
1274
1278
mod test {
1275
1279
// FIXME don't run on fbsd or linux 32 bit(#2064)
1276
1280
#[ cfg( target_os="win32" ) ]
@@ -1303,6 +1307,7 @@ mod test {
1303
1307
}
1304
1308
}
1305
1309
fn impl_gl_tcp_ipv4_server_and_client ( ) {
1310
+ let hl_loop = uv:: global_loop:: get ( ) ;
1306
1311
let server_ip = "127.0.0.1" ;
1307
1312
let server_port = 8888 u;
1308
1313
let expected_req = "ping" ;
@@ -1321,7 +1326,8 @@ mod test {
1321
1326
server_port,
1322
1327
expected_resp,
1323
1328
server_ch,
1324
- cont_ch)
1329
+ cont_ch,
1330
+ hl_loop)
1325
1331
} ;
1326
1332
server_result_ch. send( actual_req) ;
1327
1333
} ;
@@ -1333,7 +1339,8 @@ mod test {
1333
1339
server_ip,
1334
1340
server_port,
1335
1341
expected_req,
1336
- client_ch)
1342
+ client_ch,
1343
+ hl_loop)
1337
1344
} ;
1338
1345
let actual_req = comm:: recv ( server_result_po) ;
1339
1346
log ( debug, #fmt ( "REQ: expected: '%s' actual: '%s'" ,
@@ -1344,6 +1351,7 @@ mod test {
1344
1351
assert str:: contains ( actual_resp, expected_resp) ;
1345
1352
}
1346
1353
fn impl_gl_tcp_ipv4_server_listener_and_client ( ) {
1354
+ let hl_loop = uv:: global_loop:: get ( ) ;
1347
1355
let server_ip = "127.0.0.1" ;
1348
1356
let server_port = 8889 u;
1349
1357
let expected_req = "ping" ;
@@ -1362,7 +1370,8 @@ mod test {
1362
1370
server_port,
1363
1371
expected_resp,
1364
1372
server_ch,
1365
- cont_ch)
1373
+ cont_ch,
1374
+ hl_loop)
1366
1375
} ;
1367
1376
server_result_ch. send ( actual_req) ;
1368
1377
} ;
@@ -1374,7 +1383,8 @@ mod test {
1374
1383
server_ip,
1375
1384
server_port,
1376
1385
expected_req,
1377
- client_ch)
1386
+ client_ch,
1387
+ hl_loop)
1378
1388
} ;
1379
1389
let actual_req = comm:: recv ( server_result_po) ;
1380
1390
log ( debug, #fmt ( "REQ: expected: '%s' actual: '%s'" ,
@@ -1387,12 +1397,14 @@ mod test {
1387
1397
1388
1398
fn run_tcp_test_server ( server_ip : str , server_port : uint , resp : str ,
1389
1399
server_ch : comm:: chan < str > ,
1390
- cont_ch : comm:: chan < ( ) > ) -> str {
1400
+ cont_ch : comm:: chan < ( ) > ,
1401
+ hl_loop : uv:: hl:: high_level_loop ) -> str {
1391
1402
1392
1403
task:: spawn_sched ( task:: manual_threads ( 1 u) ) { ||
1393
1404
let server_ip_addr = ip:: v4:: parse_addr ( server_ip) ;
1394
1405
let listen_result =
1395
1406
listen_for_conn ( server_ip_addr, server_port, 128 u,
1407
+ hl_loop,
1396
1408
// on_establish_cb -- called when listener is set up
1397
1409
{ |kill_ch|
1398
1410
log ( debug, #fmt ( "establish_cb %?" ,
@@ -1464,12 +1476,13 @@ mod test {
1464
1476
fn run_tcp_test_server_listener ( server_ip : str ,
1465
1477
server_port : uint , resp : str ,
1466
1478
server_ch : comm:: chan < str > ,
1467
- cont_ch : comm:: chan < ( ) > ) -> str {
1479
+ cont_ch : comm:: chan < ( ) > ,
1480
+ hl_loop : uv:: hl:: high_level_loop ) -> str {
1468
1481
1469
1482
task:: spawn_sched ( task:: manual_threads ( 1 u) ) { ||
1470
1483
let server_ip_addr = ip:: v4:: parse_addr ( server_ip) ;
1471
1484
let new_listener_result =
1472
- new_listener ( server_ip_addr, server_port, 128 u) ;
1485
+ new_listener ( server_ip_addr, server_port, 128 u, hl_loop ) ;
1473
1486
if result:: is_failure ( new_listener_result) {
1474
1487
let err_data = result:: get_err ( new_listener_result) ;
1475
1488
log ( debug, #fmt ( "SERVER: exited abnormally name %s msg %s" ,
@@ -1512,12 +1525,13 @@ mod test {
1512
1525
}
1513
1526
1514
1527
fn run_tcp_test_client ( server_ip : str , server_port : uint , resp : str ,
1515
- client_ch : comm:: chan < str > ) -> str {
1528
+ client_ch : comm:: chan < str > ,
1529
+ hl_loop : uv:: hl:: high_level_loop ) -> str {
1516
1530
1517
1531
let server_ip_addr = ip:: v4:: parse_addr ( server_ip) ;
1518
1532
1519
1533
log ( debug, "CLIENT: starting.." ) ;
1520
- let connect_result = connect ( server_ip_addr, server_port) ;
1534
+ let connect_result = connect ( server_ip_addr, server_port, hl_loop ) ;
1521
1535
if result:: is_failure ( connect_result) {
1522
1536
log ( debug, "CLIENT: failed to connect" ) ;
1523
1537
let err_data = result:: get_err ( connect_result) ;
0 commit comments