lru
svn: r3529
This commit is contained in:
parent
788d291b13
commit
929f2f5312
|
@ -1,5 +1,6 @@
|
||||||
(module lru mzscheme
|
(module lru mzscheme
|
||||||
(require (lib "plt-match.ss"))
|
(require (lib "plt-match.ss")
|
||||||
|
(lib "kw.ss"))
|
||||||
(require "manager.ss")
|
(require "manager.ss")
|
||||||
(provide create-LRU-manager)
|
(provide create-LRU-manager)
|
||||||
|
|
||||||
|
@ -14,9 +15,13 @@
|
||||||
; Private
|
; Private
|
||||||
instances
|
instances
|
||||||
next-instance-id))
|
next-instance-id))
|
||||||
(define (create-LRU-manager
|
(define/kw (create-LRU-manager
|
||||||
instance-expiration-handler
|
instance-expiration-handler
|
||||||
collect?)
|
time0 time1
|
||||||
|
collect?
|
||||||
|
#:key
|
||||||
|
[initial-count 1]
|
||||||
|
[inform-p (lambda _ (void))])
|
||||||
;; Instances
|
;; Instances
|
||||||
(define instances (make-hash-table))
|
(define instances (make-hash-table))
|
||||||
(define next-instance-id (make-counter))
|
(define next-instance-id (make-counter))
|
||||||
|
@ -68,7 +73,7 @@
|
||||||
(define salt (random 100000000))
|
(define salt (random 100000000))
|
||||||
(hash-table-put! htable
|
(hash-table-put! htable
|
||||||
k-id
|
k-id
|
||||||
(list salt k expiration-handler 1))
|
(list salt k expiration-handler initial-count))
|
||||||
(list k-id salt)]))
|
(list k-id salt)]))
|
||||||
(define (continuation-lookup instance-id a-k-id a-salt)
|
(define (continuation-lookup instance-id a-k-id a-salt)
|
||||||
(match (instance-lookup instance-id)
|
(match (instance-lookup instance-id)
|
||||||
|
@ -131,17 +136,27 @@
|
||||||
(set-box! removed (add1 (unbox removed)))
|
(set-box! removed (add1 (unbox removed)))
|
||||||
(hash-table-remove! instances instance-id))])))
|
(hash-table-remove! instances instance-id))])))
|
||||||
(unless (zero? (unbox removed))
|
(unless (zero? (unbox removed))
|
||||||
#;(printf "Collect: ~S ~S~n"
|
(inform-p (unbox removed))
|
||||||
(unbox removed)
|
|
||||||
(round (/ (current-memory-use)
|
|
||||||
(* 1024 1024))))
|
|
||||||
(collect-garbage)
|
(collect-garbage)
|
||||||
(collect-garbage)))
|
(collect-garbage)))
|
||||||
(define manager-thread
|
(define manager-thread
|
||||||
(thread
|
(thread
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let loop ()
|
(define (seconds->msecs s)
|
||||||
(collect)
|
(+ (current-inexact-milliseconds)
|
||||||
(loop)))))
|
(* s 1000)))
|
||||||
|
(let loop ([msecs0 (seconds->msecs time0)]
|
||||||
|
[msecs1 (seconds->msecs time1)])
|
||||||
|
(sync (handle-evt
|
||||||
|
(alarm-evt msecs0)
|
||||||
|
(lambda _
|
||||||
|
(when (collect?)
|
||||||
|
(collect))
|
||||||
|
(loop (seconds->msecs time0) msecs1)))
|
||||||
|
(handle-evt
|
||||||
|
(alarm-evt msecs1)
|
||||||
|
(lambda _
|
||||||
|
(collect)
|
||||||
|
(loop msecs0 (seconds->msecs time1)))))))))
|
||||||
|
|
||||||
the-manager))
|
the-manager))
|
Loading…
Reference in New Issue
Block a user