brk.rs 758 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. use core::ptr;
  2. use header::errno::ENOMEM;
  3. use platform;
  4. use platform::types::*;
  5. use platform::{Pal, Sys};
  6. static mut BRK: *mut c_void = ptr::null_mut();
  7. #[no_mangle]
  8. pub unsafe extern "C" fn brk(addr: *mut c_void) -> c_int {
  9. BRK = Sys::brk(addr);
  10. if BRK < addr {
  11. platform::errno = ENOMEM;
  12. return -1;
  13. }
  14. 0
  15. }
  16. #[no_mangle]
  17. pub unsafe extern "C" fn sbrk(incr: intptr_t) -> *mut c_void {
  18. if BRK.is_null() {
  19. BRK = Sys::brk(ptr::null_mut());
  20. }
  21. let old_brk = BRK;
  22. if incr != 0 {
  23. let addr = old_brk.offset(incr);
  24. BRK = Sys::brk(addr);
  25. if BRK < addr {
  26. platform::errno = ENOMEM;
  27. return -1isize as *mut c_void;
  28. }
  29. }
  30. old_brk as *mut c_void
  31. }