heap.scm 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: David Frese, Mike Sperber
  3. ; Variables shared by various parts of the BIBOP code
  4. (define *max-heap-size* 0)
  5. (define (s48-max-heap-size)
  6. *max-heap-size*)
  7. (define (s48-set-max-heap-size! size)
  8. (set! *max-heap-size* size))
  9. (define *min-heap-size* 0)
  10. (define (s48-min-heap-size)
  11. *min-heap-size*)
  12. ; addresses of the new allocated heap areas
  13. ; <= s48_initialize_heap()
  14. (define *new-small-start-addr* null-address)
  15. (define *new-large-start-addr* null-address)
  16. (define *new-weaks-start-addr* null-address)
  17. (define (s48-get-new-small-start-addr) *new-small-start-addr*)
  18. (define (s48-get-new-large-start-addr) *new-large-start-addr*)
  19. (define (s48-get-new-weaks-start-addr) *new-weaks-start-addr*)
  20. (define (s48-set-new-small-start-addr! addr)
  21. (set! *new-small-start-addr* addr))
  22. (define (s48-set-new-large-start-addr! addr)
  23. (set! *new-large-start-addr* addr))
  24. (define (s48-set-new-weaks-start-addr! addr)
  25. (set! *new-weaks-start-addr* addr))
  26. ;; ** Availability ***************************************************
  27. (define (s48-available? cells)
  28. (>= (s48-available) cells))
  29. (define (bytes-available? bytes)
  30. (>= (s48-available) (bytes->cells bytes)))
  31. ;; ** Initialization *************************************************
  32. ; the bibop-gc doesn't look at these areas at all yet... TODO?!
  33. ;; (initial values for the type-checker)
  34. (define *pure-areas*)
  35. (define *impure-areas*)
  36. (define *pure-sizes*)
  37. (define *impure-sizes*)
  38. (define *pure-area-count* 0)
  39. (define *impure-area-count* 0)
  40. (define (s48-initialize-heap max-heap-size image-start-address image-size)
  41. (address= image-start-address null-address) ; for the type checker
  42. (= image-size 0) ; for the type checker
  43. (set! *max-heap-size* max-heap-size)
  44. (set! *min-heap-size* (* 4 image-size))
  45. (s48-initialize-bibop-heap)
  46. ;; just some silly things for the type-checker...
  47. (set! *pure-areas* (make-vector 0 (integer->address 0)))
  48. (set! *impure-areas* *pure-areas*)
  49. (set! *pure-sizes* (make-vector 0 0))
  50. (set! *impure-sizes* *pure-sizes*))
  51. ;----------------
  52. ; Keeping track of all the areas.
  53. (define (s48-register-static-areas pure-count pure-areas pure-sizes
  54. impure-count impure-areas impure-sizes)
  55. (set! *pure-area-count* pure-count)
  56. (set! *pure-areas* pure-areas)
  57. (set! *pure-sizes* pure-sizes)
  58. (set! *impure-area-count* impure-count)
  59. (set! *impure-areas* impure-areas)
  60. (set! *impure-sizes* impure-sizes))
  61. (define (walk-areas proc areas sizes count)
  62. (let loop ((i 0))
  63. (cond ((>= i count)
  64. #t)
  65. ((proc (vector-ref areas i)
  66. (address+ (vector-ref areas i)
  67. (vector-ref sizes i)))
  68. (loop (+ i 1)))
  69. (else
  70. #f))))
  71. (define (walk-pure-areas proc)
  72. (if (< 0 *pure-area-count*)
  73. (walk-areas proc *pure-areas* *pure-sizes* *pure-area-count*)
  74. #t))
  75. (define (walk-impure-areas proc)
  76. (if (< 0 *impure-area-count*)
  77. (walk-areas proc *impure-areas* *impure-sizes* *impure-area-count*)
  78. #t))