Skip to content

Commit b9608fe

Browse files
committed
std: Convert uv_global_loop to use pipes
1 parent fb92993 commit b9608fe

File tree

14 files changed

+172
-147
lines changed

14 files changed

+172
-147
lines changed

src/libcore/private/global.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,21 @@ unsafe fn global_data_modify_<T: Owned>(
114114
}
115115
}
116116

117+
pub unsafe fn global_data_clone<T: Owned Clone>(
118+
key: GlobalDataKey<T>) -> Option<T> {
119+
let mut maybe_clone: Option<T> = None;
120+
do global_data_modify(key) |current| {
121+
match &current {
122+
&Some(~ref value) => {
123+
maybe_clone = Some(value.clone());
124+
}
125+
&None => ()
126+
}
127+
current
128+
}
129+
return maybe_clone;
130+
}
131+
117132
// GlobalState is a map from keys to unique pointers and a
118133
// destructor. Keys are pointers derived from the type of the
119134
// global value. There is a single GlobalState instance per runtime.

src/libstd/flatpipes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,14 +782,14 @@ mod test {
782782
let (finish_port, finish_chan) = pipes::stream();
783783

784784
let addr = ip::v4::parse_addr("127.0.0.1");
785-
let iotask = uv::global_loop::get();
786785

787786
let begin_connect_chan = Cell(move begin_connect_chan);
788787
let accept_chan = Cell(move accept_chan);
789788

790789
// The server task
791790
do task::spawn |copy addr, move begin_connect_chan,
792791
move accept_chan| {
792+
let iotask = &uv::global_loop::get();
793793
let begin_connect_chan = begin_connect_chan.take();
794794
let accept_chan = accept_chan.take();
795795
let listen_res = do tcp::listen(
@@ -821,6 +821,7 @@ mod test {
821821
begin_connect_port.recv();
822822

823823
debug!("connecting");
824+
let iotask = &uv::global_loop::get();
824825
let connect_result = tcp::connect(copy addr, port, iotask);
825826
assert connect_result.is_ok();
826827
let sock = result::unwrap(move connect_result);

src/libstd/net_ip.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ enum IpGetAddrErr {
114114
* a vector of `ip_addr` results, in the case of success, or an error
115115
* object in the case of failure
116116
*/
117-
pub fn get_addr(node: &str, iotask: iotask)
117+
pub fn get_addr(node: &str, iotask: &iotask)
118118
-> result::Result<~[IpAddr], IpGetAddrErr> {
119119
do oldcomm::listen |output_ch| {
120120
do str::as_buf(node) |node_ptr, len| unsafe {
@@ -413,7 +413,7 @@ mod test {
413413
#[ignore(reason = "valgrind says it's leaky")]
414414
fn test_ip_get_addr() {
415415
let localhost_name = ~"localhost";
416-
let iotask = uv::global_loop::get();
416+
let iotask = &uv::global_loop::get();
417417
let ga_result = get_addr(localhost_name, iotask);
418418
if result::is_err(&ga_result) {
419419
fail ~"got err result from net::ip::get_addr();"
@@ -439,7 +439,7 @@ mod test {
439439
#[ignore(reason = "valgrind says it's leaky")]
440440
fn test_ip_get_addr_bad_input() {
441441
let localhost_name = ~"sjkl234m,./sdf";
442-
let iotask = uv::global_loop::get();
442+
let iotask = &uv::global_loop::get();
443443
let ga_result = get_addr(localhost_name, iotask);
444444
assert result::is_err(&ga_result);
445445
}

src/libstd/net_tcp.rs

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ pub enum TcpConnectErrData {
142142
* `net::tcp::tcp_connect_err_data` instance will be returned
143143
*/
144144
pub fn connect(input_ip: ip::IpAddr, port: uint,
145-
iotask: IoTask)
145+
iotask: &IoTask)
146146
-> result::Result<TcpSocket, TcpConnectErrData> unsafe {
147147
let result_po = oldcomm::Port::<ConnAttempt>();
148148
let closed_signal_po = oldcomm::Port::<()>();
@@ -164,7 +164,7 @@ pub fn connect(input_ip: ip::IpAddr, port: uint,
164164
ip::Ipv4(_) => { false }
165165
ip::Ipv6(_) => { true }
166166
},
167-
iotask: iotask
167+
iotask: iotask.clone()
168168
};
169169
let socket_data_ptr = ptr::addr_of(&(*socket_data));
170170
log(debug, fmt!("tcp_connect result_ch %?", conn_data.result_ch));
@@ -496,17 +496,17 @@ pub fn accept(new_conn: TcpNewConnection)
496496
let server_data_ptr = uv::ll::get_data_for_uv_handle(
497497
server_handle_ptr) as *TcpListenFcData;
498498
let reader_po = oldcomm::Port();
499-
let iotask = (*server_data_ptr).iotask;
499+
let iotask = &(*server_data_ptr).iotask;
500500
let stream_handle_ptr = malloc_uv_tcp_t();
501501
*(stream_handle_ptr as *mut uv::ll::uv_tcp_t) = uv::ll::tcp_t();
502-
let client_socket_data = @{
502+
let client_socket_data: @TcpSocketData = @{
503503
reader_po: reader_po,
504504
reader_ch: oldcomm::Chan(&reader_po),
505505
stream_handle_ptr : stream_handle_ptr,
506506
connect_req : uv::ll::connect_t(),
507507
write_req : uv::ll::write_t(),
508508
ipv6: (*server_data_ptr).ipv6,
509-
iotask : iotask
509+
iotask : iotask.clone()
510510
};
511511
let client_socket_data_ptr = ptr::addr_of(&(*client_socket_data));
512512
let client_stream_handle_ptr =
@@ -588,10 +588,10 @@ pub fn accept(new_conn: TcpNewConnection)
588588
* of listen exiting because of an error
589589
*/
590590
pub fn listen(host_ip: ip::IpAddr, port: uint, backlog: uint,
591-
iotask: IoTask,
592-
on_establish_cb: fn~(oldcomm::Chan<Option<TcpErrData>>),
593-
new_connect_cb: fn~(TcpNewConnection,
594-
oldcomm::Chan<Option<TcpErrData>>))
591+
iotask: &IoTask,
592+
on_establish_cb: fn~(oldcomm::Chan<Option<TcpErrData>>),
593+
new_connect_cb: fn~(TcpNewConnection,
594+
oldcomm::Chan<Option<TcpErrData>>))
595595
-> result::Result<(), TcpListenErrData> unsafe {
596596
do listen_common(move host_ip, port, backlog, iotask,
597597
move on_establish_cb)
@@ -606,7 +606,7 @@ pub fn listen(host_ip: ip::IpAddr, port: uint, backlog: uint,
606606
}
607607

608608
fn listen_common(host_ip: ip::IpAddr, port: uint, backlog: uint,
609-
iotask: IoTask,
609+
iotask: &IoTask,
610610
on_establish_cb: fn~(oldcomm::Chan<Option<TcpErrData>>),
611611
on_connect_cb: fn~(*uv::ll::uv_tcp_t))
612612
-> result::Result<(), TcpListenErrData> unsafe {
@@ -615,12 +615,12 @@ fn listen_common(host_ip: ip::IpAddr, port: uint, backlog: uint,
615615
let kill_ch = oldcomm::Chan(&kill_po);
616616
let server_stream = uv::ll::tcp_t();
617617
let server_stream_ptr = ptr::addr_of(&server_stream);
618-
let server_data = {
618+
let server_data: TcpListenFcData = {
619619
server_stream_ptr: server_stream_ptr,
620620
stream_closed_ch: oldcomm::Chan(&stream_closed_po),
621621
kill_ch: kill_ch,
622622
on_connect_cb: move on_connect_cb,
623-
iotask: iotask,
623+
iotask: iotask.clone(),
624624
ipv6: match &host_ip {
625625
&ip::Ipv4(_) => { false }
626626
&ip::Ipv6(_) => { true }
@@ -895,7 +895,7 @@ fn tear_down_socket_data(socket_data: @TcpSocketData) unsafe {
895895
};
896896
let close_data_ptr = ptr::addr_of(&close_data);
897897
let stream_handle_ptr = (*socket_data).stream_handle_ptr;
898-
do iotask::interact((*socket_data).iotask) |loop_ptr| unsafe {
898+
do iotask::interact(&(*socket_data).iotask) |loop_ptr| unsafe {
899899
log(debug, fmt!("interact dtor for tcp_socket stream %? loop %?",
900900
stream_handle_ptr, loop_ptr));
901901
uv::ll::set_data_for_uv_handle(stream_handle_ptr,
@@ -916,7 +916,7 @@ fn read_common_impl(socket_data: *TcpSocketData, timeout_msecs: uint)
916916
use timer;
917917

918918
log(debug, ~"starting tcp::read");
919-
let iotask = (*socket_data).iotask;
919+
let iotask = &(*socket_data).iotask;
920920
let rs_result = read_start_common_impl(socket_data);
921921
if result::is_err(&rs_result) {
922922
let err_data = result::get_err(&rs_result);
@@ -956,7 +956,7 @@ fn read_stop_common_impl(socket_data: *TcpSocketData) ->
956956
let stream_handle_ptr = (*socket_data).stream_handle_ptr;
957957
let stop_po = oldcomm::Port::<Option<TcpErrData>>();
958958
let stop_ch = oldcomm::Chan(&stop_po);
959-
do iotask::interact((*socket_data).iotask) |loop_ptr| unsafe {
959+
do iotask::interact(&(*socket_data).iotask) |loop_ptr| unsafe {
960960
log(debug, ~"in interact cb for tcp::read_stop");
961961
match uv::ll::read_stop(stream_handle_ptr as *uv::ll::uv_stream_t) {
962962
0i32 => {
@@ -984,7 +984,7 @@ fn read_start_common_impl(socket_data: *TcpSocketData)
984984
let start_po = oldcomm::Port::<Option<uv::ll::uv_err_data>>();
985985
let start_ch = oldcomm::Chan(&start_po);
986986
log(debug, ~"in tcp::read_start before interact loop");
987-
do iotask::interact((*socket_data).iotask) |loop_ptr| unsafe {
987+
do iotask::interact(&(*socket_data).iotask) |loop_ptr| unsafe {
988988
log(debug, fmt!("in tcp::read_start interact cb %?", loop_ptr));
989989
match uv::ll::read_start(stream_handle_ptr as *uv::ll::uv_stream_t,
990990
on_alloc_cb,
@@ -1024,7 +1024,7 @@ fn write_common_impl(socket_data_ptr: *TcpSocketData,
10241024
result_ch: oldcomm::Chan(&result_po)
10251025
};
10261026
let write_data_ptr = ptr::addr_of(&write_data);
1027-
do iotask::interact((*socket_data_ptr).iotask) |loop_ptr| unsafe {
1027+
do iotask::interact(&(*socket_data_ptr).iotask) |loop_ptr| unsafe {
10281028
log(debug, fmt!("in interact cb for tcp::write %?", loop_ptr));
10291029
match uv::ll::write(write_req_ptr,
10301030
stream_handle_ptr,
@@ -1369,7 +1369,7 @@ pub mod test {
13691369
}
13701370
}
13711371
pub fn impl_gl_tcp_ipv4_server_and_client() {
1372-
let hl_loop = uv::global_loop::get();
1372+
let hl_loop = &uv::global_loop::get();
13731373
let server_ip = ~"127.0.0.1";
13741374
let server_port = 8888u;
13751375
let expected_req = ~"ping";
@@ -1381,6 +1381,7 @@ pub mod test {
13811381
let cont_po = oldcomm::Port::<()>();
13821382
let cont_ch = oldcomm::Chan(&cont_po);
13831383
// server
1384+
let hl_loop_clone = hl_loop.clone();
13841385
do task::spawn_sched(task::ManualThreads(1u)) {
13851386
let actual_req = do oldcomm::listen |server_ch| {
13861387
run_tcp_test_server(
@@ -1389,7 +1390,7 @@ pub mod test {
13891390
expected_resp,
13901391
server_ch,
13911392
cont_ch,
1392-
hl_loop)
1393+
&hl_loop_clone)
13931394
};
13941395
server_result_ch.send(actual_req);
13951396
};
@@ -1415,7 +1416,7 @@ pub mod test {
14151416
assert str::contains(actual_resp, expected_resp);
14161417
}
14171418
pub fn impl_gl_tcp_ipv4_get_peer_addr() {
1418-
let hl_loop = uv::global_loop::get();
1419+
let hl_loop = &uv::global_loop::get();
14191420
let server_ip = ~"127.0.0.1";
14201421
let server_port = 8887u;
14211422
let expected_resp = ~"pong";
@@ -1426,6 +1427,7 @@ pub mod test {
14261427
let cont_po = oldcomm::Port::<()>();
14271428
let cont_ch = oldcomm::Chan(&cont_po);
14281429
// server
1430+
let hl_loop_clone = hl_loop.clone();
14291431
do task::spawn_sched(task::ManualThreads(1u)) {
14301432
let actual_req = do oldcomm::listen |server_ch| {
14311433
run_tcp_test_server(
@@ -1434,7 +1436,7 @@ pub mod test {
14341436
expected_resp,
14351437
server_ch,
14361438
cont_ch,
1437-
hl_loop)
1439+
&hl_loop_clone)
14381440
};
14391441
server_result_ch.send(actual_req);
14401442
};
@@ -1445,10 +1447,11 @@ pub mod test {
14451447
let server_ip_addr = ip::v4::parse_addr(server_ip);
14461448
let iotask = uv::global_loop::get();
14471449
let connect_result = connect(move server_ip_addr, server_port,
1448-
iotask);
1450+
&iotask);
14491451
14501452
let sock = result::unwrap(move connect_result);
14511453
1454+
debug!("testing peer address");
14521455
// This is what we are actually testing!
14531456
assert net::ip::format_addr(&sock.get_peer_addr()) ==
14541457
~"127.0.0.1";
@@ -1457,12 +1460,14 @@ pub mod test {
14571460
// Fulfill the protocol the test server expects
14581461
let resp_bytes = str::to_bytes(~"ping");
14591462
tcp_write_single(&sock, resp_bytes);
1463+
debug!("message sent");
14601464
let read_result = sock.read(0u);
14611465
client_ch.send(str::from_bytes(read_result.get()));
1466+
debug!("result read");
14621467
};
14631468
}
14641469
pub fn impl_gl_tcp_ipv4_client_error_connection_refused() {
1465-
let hl_loop = uv::global_loop::get();
1470+
let hl_loop = &uv::global_loop::get();
14661471
let server_ip = ~"127.0.0.1";
14671472
let server_port = 8889u;
14681473
let expected_req = ~"ping";
@@ -1482,7 +1487,7 @@ pub mod test {
14821487
}
14831488
}
14841489
pub fn impl_gl_tcp_ipv4_server_address_in_use() {
1485-
let hl_loop = uv::global_loop::get();
1490+
let hl_loop = &uv::global_loop::get();
14861491
let server_ip = ~"127.0.0.1";
14871492
let server_port = 8890u;
14881493
let expected_req = ~"ping";
@@ -1494,6 +1499,7 @@ pub mod test {
14941499
let cont_po = oldcomm::Port::<()>();
14951500
let cont_ch = oldcomm::Chan(&cont_po);
14961501
// server
1502+
let hl_loop_clone = hl_loop.clone();
14971503
do task::spawn_sched(task::ManualThreads(1u)) {
14981504
let actual_req = do oldcomm::listen |server_ch| {
14991505
run_tcp_test_server(
@@ -1502,7 +1508,7 @@ pub mod test {
15021508
expected_resp,
15031509
server_ch,
15041510
cont_ch,
1505-
hl_loop)
1511+
&hl_loop_clone)
15061512
};
15071513
server_result_ch.send(actual_req);
15081514
};
@@ -1533,7 +1539,7 @@ pub mod test {
15331539
}
15341540
}
15351541
pub fn impl_gl_tcp_ipv4_server_access_denied() {
1536-
let hl_loop = uv::global_loop::get();
1542+
let hl_loop = &uv::global_loop::get();
15371543
let server_ip = ~"127.0.0.1";
15381544
let server_port = 80u;
15391545
// this one should fail..
@@ -1553,7 +1559,7 @@ pub mod test {
15531559
}
15541560
pub fn impl_gl_tcp_ipv4_server_client_reader_writer() {
15551561

1556-
let iotask = uv::global_loop::get();
1562+
let iotask = &uv::global_loop::get();
15571563
let server_ip = ~"127.0.0.1";
15581564
let server_port = 8891u;
15591565
let expected_req = ~"ping";
@@ -1565,6 +1571,7 @@ pub mod test {
15651571
let cont_po = oldcomm::Port::<()>();
15661572
let cont_ch = oldcomm::Chan(&cont_po);
15671573
// server
1574+
let iotask_clone = iotask.clone();
15681575
do task::spawn_sched(task::ManualThreads(1u)) {
15691576
let actual_req = do oldcomm::listen |server_ch| {
15701577
run_tcp_test_server(
@@ -1573,7 +1580,7 @@ pub mod test {
15731580
expected_resp,
15741581
server_ch,
15751582
cont_ch,
1576-
iotask)
1583+
&iotask_clone)
15771584
};
15781585
server_result_ch.send(actual_req);
15791586
};
@@ -1604,7 +1611,7 @@ pub mod test {
16041611
pub fn impl_tcp_socket_impl_reader_handles_eof() {
16051612
use core::io::{Reader,ReaderUtil};
16061613

1607-
let hl_loop = uv::global_loop::get();
1614+
let hl_loop = &uv::global_loop::get();
16081615
let server_ip = ~"127.0.0.1";
16091616
let server_port = 10041u;
16101617
let expected_req = ~"GET /";
@@ -1616,6 +1623,7 @@ pub mod test {
16161623
let cont_po = oldcomm::Port::<()>();
16171624
let cont_ch = oldcomm::Chan(&cont_po);
16181625
// server
1626+
let hl_loop_clone = hl_loop.clone();
16191627
do task::spawn_sched(task::ManualThreads(1u)) {
16201628
let actual_req = do oldcomm::listen |server_ch| {
16211629
run_tcp_test_server(
@@ -1624,7 +1632,7 @@ pub mod test {
16241632
expected_resp,
16251633
server_ch,
16261634
cont_ch,
1627-
hl_loop)
1635+
&hl_loop_clone)
16281636
};
16291637
server_result_ch.send(actual_req);
16301638
};
@@ -1664,7 +1672,7 @@ pub mod test {
16641672
fn run_tcp_test_server(server_ip: &str, server_port: uint, resp: ~str,
16651673
server_ch: oldcomm::Chan<~str>,
16661674
cont_ch: oldcomm::Chan<()>,
1667-
iotask: IoTask) -> ~str {
1675+
iotask: &IoTask) -> ~str {
16681676
let server_ip_addr = ip::v4::parse_addr(server_ip);
16691677
let listen_result = listen(move server_ip_addr, server_port, 128,
16701678
iotask,
@@ -1751,7 +1759,7 @@ pub mod test {
17511759
}
17521760

17531761
fn run_tcp_test_server_fail(server_ip: &str, server_port: uint,
1754-
iotask: IoTask) -> TcpListenErrData {
1762+
iotask: &IoTask) -> TcpListenErrData {
17551763
let server_ip_addr = ip::v4::parse_addr(server_ip);
17561764
let listen_result = listen(move server_ip_addr, server_port, 128,
17571765
iotask,
@@ -1775,7 +1783,7 @@ pub mod test {
17751783

17761784
fn run_tcp_test_client(server_ip: &str, server_port: uint, resp: &str,
17771785
client_ch: oldcomm::Chan<~str>,
1778-
iotask: IoTask) -> result::Result<~str,
1786+
iotask: &IoTask) -> result::Result<~str,
17791787
TcpConnectErrData> {
17801788
let server_ip_addr = ip::v4::parse_addr(server_ip);
17811789

0 commit comments

Comments
 (0)