diff options
author | Bartosz Taudul <wolf.pld@gmail.com> | 2019-09-26 23:55:02 +0300 |
---|---|---|
committer | Bartosz Taudul <wolf.pld@gmail.com> | 2019-09-26 23:55:02 +0300 |
commit | 6f5dd44f1fb662958e7f648f1efb1683c704c619 (patch) | |
tree | 106cb0125ca187df17c1a8fe13ed7be652e578af /extra | |
parent | c09f3c0676848f8276317cd08b0d9fd703f3b6c9 (diff) |
Helper for reading data from kernel more efficiently.
Diffstat (limited to 'extra')
-rw-r--r-- | extra/systrace/tracy_systrace.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/extra/systrace/tracy_systrace.c b/extra/systrace/tracy_systrace.c new file mode 100644 index 00000000..3ecc0f4d --- /dev/null +++ b/extra/systrace/tracy_systrace.c @@ -0,0 +1,36 @@ +#include <fcntl.h> +#include <poll.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <time.h> +#include <unistd.h> + +enum { BufSize = 64*1024 }; + +int main() +{ + char buf[BufSize]; + + int kernelFd = open( "/sys/kernel/debug/tracing/trace_pipe", O_RDONLY ); + if( kernelFd == -1 ) return -1; + + struct pollfd pfd; + pfd.fd = kernelFd; + pfd.events = POLLIN | POLLERR; + + struct timespec sleepTime; + sleepTime.tv_sec = 0; + sleepTime.tv_nsec = 1000 * 1000 * 10; + + for(;;) + { + while( poll( &pfd, 1, 0 ) <= 0 ) nanosleep( &sleepTime, NULL ); + const int rd = read( kernelFd, buf, BufSize ); + if( rd <= 0 ) break; + write( STDOUT_FILENO, buf, rd ); + } + + close( kernelFd ); + return 0; +} |