Guest User

Untitled

a guest
Jul 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. #lang mzscheme
  2.  
  3. (require (lib "foreign.ss"))
  4. (unsafe!)
  5.  
  6. (define ptr (make-thread-cell #f))
  7. (define (get-ptr)
  8. (or (thread-cell-ref ptr)
  9. (let ([p (malloc _scheme 1)]) (thread-cell-set! ptr p) p)))
  10.  
  11. ; set a pointer to the cons cell, then dereference it as a pointer,
  12. ; and bang the new value in the given offset
  13. (define (set-ca/dr! offset who p x)
  14. (if (pair? p)
  15. (let ([p* (get-ptr)])
  16. (ptr-set! p* _scheme p)
  17. (ptr-set! (ptr-ref p* _pointer 0) _scheme offset x))
  18. (raise-type-error who "pair" p)))
  19.  
  20. (define (n-set-car! p x) (set-ca/dr! 1 'set-car! p x))
  21. (define (n-set-cdr! p x) (set-ca/dr! 2 'set-cdr! p x))
  22.  
  23. ; decide at run-time whether the underlying mzscheme supports
  24. ; set-car! and set-cdr!, since I can't figure out how to do it
  25. ; at compile time.
  26. ;NOOB
  27.  
  28. (define x-set-car!
  29. (let ((fn (namespace-variable-value 'set-car! #t (lambda () #f))))
  30. (if (procedure? fn)
  31. fn
  32. n-set-car!)))
  33.  
  34. (define x-set-cdr!
  35. (let ((fn (namespace-variable-value 'set-cdr! #t (lambda () #f))))
  36. (if (procedure? fn)
  37. fn
  38. n-set-cdr!)))
  39.  
  40.  
  41. (define _q (list 'nil 'nil 0))
  42. (define (_prn ach)
  43. (display ach)
  44. (newline))
  45.  
  46.  
  47. (define (_verify q)
  48. (_prn q)
  49. (if (eq? (car q) 'nil)
  50. #f
  51. ; The contract for queues: q.1 is reachable from q.0
  52. (unless (let loop ((q0 (car q)))
  53. (cond ((eq? q0 'nil) #f)
  54. ((eq? q0 (cadr q)) #t)
  55. (#t (loop (cdr q0)))))
  56. (_prn "error^^^"))))
  57.  
  58. (define (rept n thunk)
  59. (if (= n 0)
  60. #f
  61. (begin (thunk)
  62. (rept (- n 1) thunk))))
  63. (define (until test-thunk thunk)
  64. (if (test-thunk)
  65. #f
  66. (begin (thunk)
  67. (until test-thunk thunk))))
  68.  
  69. (define (_enq obj q)
  70. (let ((u (current-gc-milliseconds)))
  71. (x-set-car! (cddr q) (+ 1 (caddr q)))
  72. (if (eq? 'nil (car q))
  73. (x-set-car! (cdr q) (let ((u (cons obj 'nil)))
  74. (x-set-car! q u)
  75. u))
  76. (begin (x-set-cdr! (cadr q) (cons obj 'nil))
  77. (x-set-car! (cdr q) (cdr (cadr q)))))
  78. (unless (= u (current-gc-milliseconds))
  79. (_prn "GC around enq"))))
  80.  
  81. (define (_deq q)
  82. (let ((u (current-gc-milliseconds)))
  83. (unless (= (caddr q) 0)
  84. (x-set-car! (cddr q) (- (caddr q) 1)))
  85. (x-set-car! q (cdr (car q)))
  86. (unless (= u (current-gc-milliseconds))
  87. (_prn "GC around deq"))))
  88.  
  89. (define (_qlen q)
  90. (caddr q))
  91.  
  92. (define (run)
  93. (set! _q (list 'nil 'nil 0))
  94. (rept 1000000
  95. (lambda ()
  96. (_prn "iter")
  97. (rept (random 10)
  98. (lambda ()
  99. (_verify _q)
  100. (_enq 0 _q)))
  101. (_prn "deq")
  102. (until (lambda () (= 0 (_qlen _q)))
  103. (lambda ()
  104. (_verify _q)
  105. (_deq _q))))))
  106.  
  107. ;(run)
Add Comment
Please, Sign In to add comment