Skip to content

Commit 2553cc2

Browse files
committed
---
yaml --- r: 139874 b: refs/heads/try2 c: ab08b4f h: refs/heads/master v: v3
1 parent 321f879 commit 2553cc2

File tree

7 files changed

+122
-59
lines changed

7 files changed

+122
-59
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 2a864852774e924f1f9bb68da34adca736211545
8+
refs/heads/try2: ab08b4fbfde7e9cc9e0de07aed17b4d4e06ccc3e
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/pipes.rs

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ bounded and unbounded protocols allows for less code duplication.
8383
*/
8484

8585
use cast::{forget, reinterpret_cast, transmute};
86-
use cell::Cell;
8786
use either::{Either, Left, Right};
8887
use kinds::Owned;
8988
use libc;
@@ -902,51 +901,6 @@ pub fn entangle<T>() -> (SendPacket<T>, RecvPacket<T>) {
902901
(SendPacket(p), RecvPacket(p))
903902
}
904903
905-
/** Spawn a task to provide a service.
906-
907-
It takes an initialization function that produces a send and receive
908-
endpoint. The send endpoint is returned to the caller and the receive
909-
endpoint is passed to the new task.
910-
911-
*/
912-
pub fn spawn_service<T:Owned,Tb:Owned>(
913-
init: extern fn() -> (SendPacketBuffered<T, Tb>,
914-
RecvPacketBuffered<T, Tb>),
915-
service: ~fn(v: RecvPacketBuffered<T, Tb>))
916-
-> SendPacketBuffered<T, Tb> {
917-
let (client, server) = init();
918-
919-
// This is some nasty gymnastics required to safely move the pipe
920-
// into a new task.
921-
let server = Cell(server);
922-
do task::spawn {
923-
service(server.take());
924-
}
925-
926-
client
927-
}
928-
929-
/** Like `spawn_service_recv`, but for protocols that start in the
930-
receive state.
931-
932-
*/
933-
pub fn spawn_service_recv<T:Owned,Tb:Owned>(
934-
init: extern fn() -> (RecvPacketBuffered<T, Tb>,
935-
SendPacketBuffered<T, Tb>),
936-
service: ~fn(v: SendPacketBuffered<T, Tb>))
937-
-> RecvPacketBuffered<T, Tb> {
938-
let (client, server) = init();
939-
940-
// This is some nasty gymnastics required to safely move the pipe
941-
// into a new task.
942-
let server = Cell(server);
943-
do task::spawn {
944-
service(server.take())
945-
}
946-
947-
client
948-
}
949-
950904
pub mod rt {
951905
use option::{None, Option, Some};
952906

branches/try2/src/rt/arch/x86_64/morestack.S

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ MORESTACK:
5454
// Calculate the CFA as on offset from %ebp
5555
.cfi_def_cfa_register %rbp
5656

57-
subq $56, %rsp
57+
subq $184, %rsp
5858

5959
// Save argument registers of the original function
6060
movq %rdi, (%rsp)
@@ -63,6 +63,14 @@ MORESTACK:
6363
movq %rcx, 24(%rsp)
6464
movq %r8, 32(%rsp)
6565
movq %r9, 40(%rsp)
66+
movdqa %xmm0, 48(%rsp)
67+
movdqa %xmm1, 64(%rsp)
68+
movdqa %xmm2, 80(%rsp)
69+
movdqa %xmm3, 96(%rsp)
70+
movdqa %xmm4, 112(%rsp)
71+
movdqa %xmm5, 128(%rsp)
72+
movdqa %xmm6, 144(%rsp)
73+
movdqa %xmm7, 160(%rsp)
6674

6775
// Calculate the address of the stack arguments.
6876
// We have the base pointer, __morestack's return address,
@@ -93,8 +101,16 @@ MORESTACK:
93101
movq 24(%rsp), %rcx
94102
movq 32(%rsp), %r8
95103
movq 40(%rsp), %r9
96-
97-
addq $56, %rsp
104+
movdqa 48(%rsp), %xmm0
105+
movdqa 64(%rsp), %xmm1
106+
movdqa 80(%rsp), %xmm2
107+
movdqa 96(%rsp), %xmm3
108+
movdqa 112(%rsp), %xmm4
109+
movdqa 128(%rsp), %xmm5
110+
movdqa 144(%rsp), %xmm6
111+
movdqa 160(%rsp), %xmm7
112+
113+
addq $184, %rsp
98114

99115
movq 8(%rbp),%r10 // Grab the return pointer.
100116
incq %r10 // Skip past the `ret` in our parent frame

branches/try2/src/test/bench/pingpong.rs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
extern mod std;
1616

17-
use core::pipes::{spawn_service, recv};
17+
use core::cell::Cell;
18+
use core::pipes::*;
1819
use std::time::precise_time_s;
1920

2021
proto! pingpong (
@@ -70,6 +71,52 @@ macro_rules! follow (
7071
)
7172
)
7273

74+
75+
/** Spawn a task to provide a service.
76+
77+
It takes an initialization function that produces a send and receive
78+
endpoint. The send endpoint is returned to the caller and the receive
79+
endpoint is passed to the new task.
80+
81+
*/
82+
pub fn spawn_service<T:Owned,Tb:Owned>(
83+
init: extern fn() -> (SendPacketBuffered<T, Tb>,
84+
RecvPacketBuffered<T, Tb>),
85+
service: ~fn(v: RecvPacketBuffered<T, Tb>))
86+
-> SendPacketBuffered<T, Tb> {
87+
let (client, server) = init();
88+
89+
// This is some nasty gymnastics required to safely move the pipe
90+
// into a new task.
91+
let server = Cell(server);
92+
do task::spawn {
93+
service(server.take());
94+
}
95+
96+
client
97+
}
98+
99+
/** Like `spawn_service_recv`, but for protocols that start in the
100+
receive state.
101+
102+
*/
103+
pub fn spawn_service_recv<T:Owned,Tb:Owned>(
104+
init: extern fn() -> (RecvPacketBuffered<T, Tb>,
105+
SendPacketBuffered<T, Tb>),
106+
service: ~fn(v: SendPacketBuffered<T, Tb>))
107+
-> RecvPacketBuffered<T, Tb> {
108+
let (client, server) = init();
109+
110+
// This is some nasty gymnastics required to safely move the pipe
111+
// into a new task.
112+
let server = Cell(server);
113+
do task::spawn {
114+
service(server.take())
115+
}
116+
117+
client
118+
}
119+
73120
fn switch<T:Owned,Tb:Owned,U>(+endp: core::pipes::RecvPacketBuffered<T, Tb>,
74121
f: &fn(+v: Option<T>) -> U) -> U {
75122
f(core::pipes::try_recv(endp))

branches/try2/src/test/run-pass/pipe-detect-term.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ extern mod std;
1818
use std::timer::sleep;
1919
use std::uv;
2020

21-
use core::pipes;
21+
use core::cell::Cell;
2222
use core::pipes::{try_recv, recv};
2323

2424
proto! oneshot (
@@ -30,12 +30,14 @@ proto! oneshot (
3030
pub fn main() {
3131
let iotask = &uv::global_loop::get();
3232

33-
pipes::spawn_service(oneshot::init, |p| {
34-
match try_recv(p) {
33+
let (chan, port) = oneshot::init();
34+
let port = Cell(port);
35+
do spawn {
36+
match try_recv(port.take()) {
3537
Some(*) => { fail!() }
3638
None => { }
3739
}
38-
});
40+
}
3941

4042
sleep(iotask, 100);
4143

branches/try2/src/test/run-pass/pipe-select.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ extern mod std;
1717
use std::timer::sleep;
1818
use std::uv;
1919

20+
use core::cell::Cell;
2021
use core::pipes;
21-
use core::pipes::{recv, select};
22+
use core::pipes::*;
2223

2324
proto! oneshot (
2425
waiting:send {
@@ -32,13 +33,30 @@ proto! stream (
3233
}
3334
)
3435

36+
pub fn spawn_service<T:Owned,Tb:Owned>(
37+
init: extern fn() -> (SendPacketBuffered<T, Tb>,
38+
RecvPacketBuffered<T, Tb>),
39+
service: ~fn(v: RecvPacketBuffered<T, Tb>))
40+
-> SendPacketBuffered<T, Tb> {
41+
let (client, server) = init();
42+
43+
// This is some nasty gymnastics required to safely move the pipe
44+
// into a new task.
45+
let server = Cell(server);
46+
do task::spawn {
47+
service(server.take());
48+
}
49+
50+
client
51+
}
52+
3553
pub fn main() {
3654
use oneshot::client::*;
3755
use stream::client::*;
3856

3957
let iotask = &uv::global_loop::get();
4058

41-
let c = pipes::spawn_service(stream::init, |p| {
59+
let c = spawn_service(stream::init, |p| {
4260
error!("waiting for pipes");
4361
let stream::send(x, p) = recv(p);
4462
error!("got pipes");

branches/try2/src/test/run-pass/pipe-sleep.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,45 @@
1313
extern mod std;
1414
use std::timer::sleep;
1515
use std::uv;
16+
use core::cell::Cell;
1617
use core::pipes;
17-
use core::pipes::recv;
18+
use core::pipes::*;
1819

1920
proto! oneshot (
2021
waiting:send {
2122
signal -> !
2223
}
2324
)
2425

26+
27+
/** Spawn a task to provide a service.
28+
29+
It takes an initialization function that produces a send and receive
30+
endpoint. The send endpoint is returned to the caller and the receive
31+
endpoint is passed to the new task.
32+
33+
*/
34+
pub fn spawn_service<T:Owned,Tb:Owned>(
35+
init: extern fn() -> (SendPacketBuffered<T, Tb>,
36+
RecvPacketBuffered<T, Tb>),
37+
service: ~fn(v: RecvPacketBuffered<T, Tb>))
38+
-> SendPacketBuffered<T, Tb> {
39+
let (client, server) = init();
40+
41+
// This is some nasty gymnastics required to safely move the pipe
42+
// into a new task.
43+
let server = Cell(server);
44+
do task::spawn {
45+
service(server.take());
46+
}
47+
48+
client
49+
}
50+
2551
pub fn main() {
2652
use oneshot::client::*;
2753

28-
let c = pipes::spawn_service(oneshot::init, |p| { recv(p); });
54+
let c = spawn_service(oneshot::init, |p| { recv(p); });
2955

3056
let iotask = &uv::global_loop::get();
3157
sleep(iotask, 500);

0 commit comments

Comments
 (0)