summary refs log tree commit diff
path: root/src/test/run-pass/chan-leak.rs
blob: 152f74d683d34f8bb7012966f16f90450bdd8d9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// Issue #763

use std;
import task;
import comm::chan;
import comm::send;
import comm;
import comm::port;
import comm::recv;

enum request { quit, close(chan<bool>), }

type ctx = chan<request>;

fn request_task(c: chan<ctx>) {
    let p = port();
    send(c, chan(p));
    let mut req: request;
    req = recv(p);
    // Need to drop req before receiving it again
    req = recv(p);
}

fn new_cx() -> ctx {
    let p = port();
    let ch = chan(p);
    let t = task::spawn {|| request_task(ch); };
    let mut cx: ctx;
    cx = recv(p);
    ret cx;
}

fn main() {
    let cx = new_cx();

    let p = port::<bool>();
    send(cx, close(chan(p)));
    send(cx, quit);
}