File tree Expand file tree Collapse file tree 2 files changed +46
-0
lines changed Expand file tree Collapse file tree 2 files changed +46
-0
lines changed Original file line number Diff line number Diff line change @@ -144,6 +144,15 @@ fn recv<T: send>(-p: recv_packet<T>) -> option<T> {
144
144
}
145
145
}
146
146
147
+ /// Returns true if messages are available.
148
+ fn peek < T : send > ( p : recv_packet < T > ) -> bool {
149
+ alt p. header ( ) . state {
150
+ empty { false }
151
+ blocked { fail "peeking on blocked packet" }
152
+ full | terminated { true }
153
+ }
154
+ }
155
+
147
156
fn sender_terminate < T : send > ( p : * packet < T > ) {
148
157
let p = unsafe { uniquify ( p) } ;
149
158
alt swap_state_rel ( p. header . state , terminated) {
@@ -337,6 +346,20 @@ class recv_packet<T: send> {
337
346
p <-> self . p ;
338
347
option:: unwrap ( p)
339
348
}
349
+
350
+ fn header( ) -> & self . packet_header {
351
+ alt self . p {
352
+ some ( packet) {
353
+ unsafe {
354
+ let packet = uniquify ( packet) ;
355
+ let header = reinterpret_cast ( & packet. header ) ;
356
+ forget ( packet) ;
357
+ header
358
+ }
359
+ }
360
+ none { fail "packet already consumed" }
361
+ }
362
+ }
340
363
}
341
364
342
365
fn entangle<T : send>( ) -> ( send_packet<T >, recv_packet<T >) {
Original file line number Diff line number Diff line change
1
+ // xfail-pretty
2
+
3
+ use std;
4
+ import std:: timer:: sleep;
5
+ import std:: uv;
6
+
7
+ proto ! oneshot {
8
+ waiting: send {
9
+ signal -> signaled
10
+ }
11
+
12
+ signaled: send { }
13
+ }
14
+
15
+ fn main ( ) {
16
+ let ( c, p) = oneshot:: init ( ) ;
17
+
18
+ assert !pipes:: peek ( p) ;
19
+
20
+ oneshot:: client:: signal ( c) ;
21
+
22
+ assert pipes:: peek ( p) ;
23
+ }
You can’t perform that action at this time.
0 commit comments