Guest User

Untitled

a guest
May 22nd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.91 KB | None | 0 0
  1. extern crate libc;
  2.  
  3. use libc::{malloc, free, c_void};
  4.  
  5. trait Trace {}
  6.  
  7. struct MyTrace {
  8. #[allow(dead_code)]
  9. buf: *mut c_void,
  10. }
  11.  
  12. impl MyTrace {
  13. fn new() -> Self {
  14. Self{buf: unsafe{malloc(128)}}
  15. }
  16. }
  17.  
  18. impl Trace for MyTrace {}
  19.  
  20. impl Drop for MyTrace {
  21. fn drop(&mut self) {
  22. unsafe{free(self.buf)};
  23. }
  24. }
  25.  
  26. trait Tracer {
  27. fn start(&mut self);
  28. fn stop(&mut self) -> Box<Trace>;
  29. }
  30.  
  31. struct MyTracer {
  32. trace: Option<MyTrace>,
  33. }
  34.  
  35. impl MyTracer {
  36. fn new() -> Self {
  37. Self{trace: None}
  38. }
  39. }
  40.  
  41. impl Tracer for MyTracer {
  42. fn start(&mut self) {
  43. self.trace = Some(MyTrace::new());
  44. // Pretend the buffer is mutated in C here...
  45. }
  46.  
  47. fn stop(&mut self) -> Box<Trace> {
  48. Box::new(self.trace.take().unwrap())
  49. }
  50. }
  51.  
  52. fn main() {
  53. let mut tracer = MyTracer::new();
  54. tracer.start();
  55. let _trace = tracer.stop();
  56. println!("Hello, world!");
  57. }
Add Comment
Please, Sign In to add comment