@@ -12,7 +12,6 @@ use anyhow::Context;
1212use anyhow:: Result ;
1313
1414use std:: ffi:: c_ulong;
15- use std:: ffi:: c_void;
1615
1716use std:: os:: fd:: AsFd ;
1817use std:: os:: fd:: AsRawFd ;
@@ -26,15 +25,11 @@ use scx_utils::NR_CPU_IDS;
2625
2726use simplelog:: { ColorChoice , Config as SimplelogConfig , TermLogger , TerminalMode } ;
2827
29- use libbpf_rs:: libbpf_sys;
30-
3128use libbpf_rs:: skel:: OpenSkel ;
3229use libbpf_rs:: skel:: SkelBuilder ;
3330use libbpf_rs:: PrintLevel ;
3431use libbpf_rs:: ProgramInput ;
35-
36- const BPF_STDOUT : u32 = 1 ;
37- const BPF_STDERR : u32 = 2 ;
32+ use libbpf_rs:: Stream ;
3833
3934fn setup_arenas ( skel : & mut BpfSkel < ' _ > ) -> Result < ( ) > {
4035 const STATIC_ALLOC_PAGES_GRANULARITY : c_ulong = 512 ;
@@ -164,35 +159,27 @@ fn setup_topology(skel: &mut BpfSkel<'_>) -> Result<()> {
164159}
165160
166161fn print_stream ( skel : & mut BpfSkel < ' _ > , stream_id : u32 ) -> ( ) {
167- let mut buf = vec ! [ 0u8 ; 4096 ] ;
168- let name = if stream_id == 1 { "OUTPUT" } else { "ERROR" } ;
162+ let name = if stream_id == libbpf_rs:: BPF_STDOUT { "OUTPUT" } else { "ERROR" } ;
169163 let mut started = false ;
170164
165+ let fd = skel. progs . arena_selftest . as_fd ( ) . as_raw_fd ( ) ;
166+ let stream = Stream :: new ( fd, stream_id) ;
171167 loop {
172- let ret = unsafe {
173- libbpf_sys:: bpf_prog_stream_read (
174- skel. progs . arena_selftest . as_fd ( ) . as_raw_fd ( ) ,
175- stream_id,
176- buf. as_mut_ptr ( ) as * mut c_void ,
177- buf. len ( ) as u32 ,
178- std:: ptr:: null_mut ( ) ,
179- )
168+ let output = match stream. read ( ) {
169+ Ok ( out) => out,
170+ Err ( _) => { eprintln ! ( "STREAM {} UNAVAILABLE (REQUIRES >= v6.17)" , name) ; return ; }
180171 } ;
181- if ret < 0 {
182- eprintln ! ( "STREAM {} UNAVAILABLE (REQUIRES >= v6.17)" , name) ;
183- return ;
184- }
185172
186173 if !started {
187174 println ! ( "===BEGIN STREAM {}===" , name) ;
188175 started = true ;
189176 }
190177
191- if ret == 0 {
192- break ;
193- }
178+ match output {
179+ Some ( string) => print ! ( "{}" , string) ,
180+ None => break ,
181+ } ;
194182
195- print ! ( "{}" , String :: from_utf8_lossy( & buf[ ..ret as usize ] ) ) ;
196183 }
197184
198185 println ! ( "\n ====END STREAM {}====" , name) ;
@@ -239,6 +226,6 @@ fn main() {
239226 println ! ( "Selftest successful." ) ;
240227 }
241228
242- print_stream ( & mut skel, BPF_STDOUT ) ;
243- print_stream ( & mut skel, BPF_STDERR ) ;
229+ print_stream ( & mut skel, libbpf_rs :: BPF_STDOUT ) ;
230+ print_stream ( & mut skel, libbpf_rs :: BPF_STDERR ) ;
244231}
0 commit comments