File tree 1 file changed +62
-0
lines changed
1 file changed +62
-0
lines changed Original file line number Diff line number Diff line change
1
+ // xfail-stage0
2
+
3
+ use std;
4
+ import std:: ivec;
5
+
6
+ tag msg {
7
+ closed;
8
+ received ( u8[ ] ) ;
9
+ }
10
+
11
+ fn producer ( chan[ u8 [ ] ] c ) {
12
+ c <| ~[ 1u8 , 2u8 , 3u8 , 4u8 ] ;
13
+ let u8 [ ] empty = ~[ ] ;
14
+ c <| empty;
15
+ }
16
+
17
+ fn packager( chan[ chan[ u8 [ ] ] ] cb , chan[ msg] msg ) {
18
+ let port[ u8[ ] ] p = port ( ) ;
19
+ cb <| chan( p) ;
20
+ while ( true ) {
21
+ log "waiting for bytes" ;
22
+ let u8 [ ] data;
23
+ p |> data;
24
+ log "got bytes" ;
25
+ if ( ivec:: len[ u8] ( data) == 0 u) {
26
+ log "got empty bytes, quitting" ;
27
+ break ;
28
+ }
29
+ log "sending non-empty buffer of length" ;
30
+ log ivec:: len[ u8] ( data) ;
31
+ msg <| received( data) ;
32
+ log "sent non-empty buffer" ;
33
+ }
34
+ log "sending closed message" ;
35
+ msg <| closed;
36
+ log "sent closed message" ;
37
+ }
38
+
39
+ fn main ( ) {
40
+ let port[ msg] p = port ( ) ;
41
+ let port[ chan[ u8[ ] ] ] recv_reader = port ( ) ;
42
+ auto pack = spawn packager ( chan ( recv_reader) , chan ( p) ) ;
43
+
44
+ let chan[ u8[ ] ] source_chan;
45
+ recv_reader |> source_chan;
46
+ let task prod = spawn producer ( source_chan) ;
47
+
48
+ while ( true ) {
49
+ let msg msg;
50
+ p |> msg;
51
+ alt ( msg) {
52
+ case ( closed) {
53
+ log "Got close message" ;
54
+ break ;
55
+ }
56
+ case ( received ( ?data) ) {
57
+ log "Got data. Length is:" ;
58
+ log ivec:: len[ u8] ( data) ;
59
+ }
60
+ }
61
+ }
62
+ }
You can’t perform that action at this time.
0 commit comments