Skip to content

Commit 92e9382

Browse files
committed
Remove task::worker
It was too unsafe to live. It already apeared to be causing problems with eholk's incoming task changes, so I'm killing it now before it can spread.
1 parent 55a65a5 commit 92e9382

File tree

3 files changed

+10
-107
lines changed

3 files changed

+10
-107
lines changed

src/lib/task.rs

Lines changed: 0 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -40,88 +40,6 @@ fn send[T](c: chan[T], v: &T) { c <| v; }
4040

4141
fn recv[T](p: port[T]) -> T { let v; p |> v; v }
4242

43-
// Spawn a task and immediately return a channel for communicating to it
44-
fn worker[T](f: fn(port[T]) ) -> {task: task, chan: chan[T]} {
45-
// FIXME: This is frighteningly unsafe and only works for
46-
// a few cases
47-
48-
type opaque = int;
49-
50-
// FIXME: This terrible hackery is because worktask can't currently
51-
// have type params
52-
type wordsz1 = int;
53-
type wordsz2 = {a: int, b: int};
54-
type wordsz3 = {a: int, b: int, c: int};
55-
type wordsz4 = {a: int, b: int, c: int, d: int};
56-
type wordsz5 = {a: int, b: int, c: int, d: int, e: int};
57-
type opaquechan_1wordsz = chan[chan[wordsz1]];
58-
type opaquechan_2wordsz = chan[chan[wordsz2]];
59-
type opaquechan_3wordsz = chan[chan[wordsz3]];
60-
type opaquechan_4wordsz = chan[chan[wordsz4]];
61-
type opaquechan_5wordsz = chan[chan[wordsz5]];
62-
63-
fn worktask1(setupch: opaquechan_1wordsz, fptr: opaque) {
64-
let f: *fn(port[wordsz1]) = unsafe::reinterpret_cast(fptr);
65-
let p = port[wordsz1]();
66-
setupch <| chan(p);
67-
(*f)(p);
68-
}
69-
70-
fn worktask2(setupch: opaquechan_2wordsz, fptr: opaque) {
71-
let f: *fn(port[wordsz2]) = unsafe::reinterpret_cast(fptr);
72-
let p = port[wordsz2]();
73-
setupch <| chan(p);
74-
(*f)(p);
75-
}
76-
77-
fn worktask3(setupch: opaquechan_3wordsz, fptr: opaque) {
78-
let f: *fn(port[wordsz3]) = unsafe::reinterpret_cast(fptr);
79-
let p = port[wordsz3]();
80-
setupch <| chan(p);
81-
(*f)(p);
82-
}
83-
84-
fn worktask4(setupch: opaquechan_4wordsz, fptr: opaque) {
85-
let f: *fn(port[wordsz4]) = unsafe::reinterpret_cast(fptr);
86-
let p = port[wordsz4]();
87-
setupch <| chan(p);
88-
(*f)(p);
89-
}
90-
91-
fn worktask5(setupch: opaquechan_5wordsz, fptr: opaque) {
92-
let f: *fn(port[wordsz5]) = unsafe::reinterpret_cast(fptr);
93-
let p = port[wordsz5]();
94-
setupch <| chan(p);
95-
(*f)(p);
96-
}
97-
98-
let p = port[chan[T]]();
99-
let setupch = chan(p);
100-
let fptr = unsafe::reinterpret_cast(ptr::addr_of(f));
101-
102-
let Tsz = sys::size_of[T]();
103-
let t =
104-
if Tsz == sys::size_of[wordsz1]() {
105-
let setupchptr = unsafe::reinterpret_cast(setupch);
106-
spawn worktask1(setupchptr, fptr)
107-
} else if (Tsz == sys::size_of[wordsz2]()) {
108-
let setupchptr = unsafe::reinterpret_cast(setupch);
109-
spawn worktask2(setupchptr, fptr)
110-
} else if (Tsz == sys::size_of[wordsz3]()) {
111-
let setupchptr = unsafe::reinterpret_cast(setupch);
112-
spawn worktask3(setupchptr, fptr)
113-
} else if (Tsz == sys::size_of[wordsz4]()) {
114-
let setupchptr = unsafe::reinterpret_cast(setupch);
115-
spawn worktask4(setupchptr, fptr)
116-
} else if (Tsz == sys::size_of[wordsz5]()) {
117-
let setupchptr = unsafe::reinterpret_cast(setupch);
118-
spawn worktask5(setupchptr, fptr)
119-
} else { fail #fmt("unhandled type size %u in task::worker", Tsz) };
120-
let ch;
121-
p |> ch;
122-
ret {task: t, chan: ch};
123-
}
124-
12543
// Local Variables:
12644
// mode: rust;
12745
// fill-column: 78;

src/test/compiletest/compiletest.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,16 @@ mod procsrv {
573573
type response = {pid: int, outfd: int};
574574

575575
fn mk() -> handle {
576-
let res = task::worker(worker);
577-
ret {task: option::some(res.task), chan: res.chan};
576+
auto setupport = port();
577+
auto task = spawn fn(chan[chan[request]] setupchan) {
578+
auto reqport = port();
579+
auto reqchan = chan(reqport);
580+
task::send(setupchan, reqchan);
581+
worker(reqport);
582+
} (chan(setupport));
583+
ret {task: option::some(task),
584+
chan: task::recv(setupport)
585+
};
578586
}
579587

580588
fn from_chan(ch: &reqchan) -> handle { {task: option::none, chan: ch} }

src/test/stdtest/task.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,3 @@ fn test_send_recv() {
3434
assert (task::recv(p) == 10);
3535
}
3636

37-
#[test]
38-
fn test_worker() {
39-
task::worker(fn (p: port[int]) { let x; p |> x; assert (x == 10); }).chan
40-
<| 10;
41-
42-
task::worker(fn (p: port[{x: int, y: int}]) {
43-
let x;
44-
p |> x;
45-
assert (x.y == 20);
46-
}).chan <| {x: 10, y: 20};
47-
48-
task::worker(fn (p: port[{x: int, y: int, z: int}]) {
49-
let x;
50-
p |> x;
51-
assert (x.z == 30);
52-
}).chan <| {x: 10, y: 20, z: 30};
53-
54-
task::worker(fn (p: port[{a: int, b: int, c: int, d: int}]) {
55-
let x;
56-
p |> x;
57-
assert (x.d == 40);
58-
}).chan <| {a: 10, b: 20, c: 30, d: 40};
59-
}

0 commit comments

Comments
 (0)