Adds an indicator that shows when framework prefs are being written.
Performance grinds to a halt when the preference file is too large or written too often. Hopefully the indicator will help us identify this phenonmenon.
This commit is contained in:
parent
5bb45d787f
commit
fbd7bdff54
|
@ -132,8 +132,11 @@ the state transitions / contracts are:
|
||||||
;; set : symbol any -> void
|
;; set : symbol any -> void
|
||||||
;; updates the preference
|
;; updates the preference
|
||||||
;; exported
|
;; exported
|
||||||
|
|
||||||
(define (multi-set ps values)
|
(define (multi-set ps values)
|
||||||
|
(dynamic-wind
|
||||||
|
(λ ()
|
||||||
|
(call-pref-save-callbacks #t))
|
||||||
|
(λ ()
|
||||||
(for-each
|
(for-each
|
||||||
(λ (p value)
|
(λ (p value)
|
||||||
(cond
|
(cond
|
||||||
|
@ -157,6 +160,30 @@ the state transitions / contracts are:
|
||||||
ps
|
ps
|
||||||
values))
|
values))
|
||||||
(void))
|
(void))
|
||||||
|
(λ ()
|
||||||
|
(call-pref-save-callbacks #f))))
|
||||||
|
|
||||||
|
(define pref-save-callbacks '())
|
||||||
|
|
||||||
|
(define (preferences:register-save-callback f)
|
||||||
|
(define key (gensym))
|
||||||
|
(set! pref-save-callbacks (cons (list key f) pref-save-callbacks))
|
||||||
|
key)
|
||||||
|
|
||||||
|
(define (preferences:unregister-save-callback k)
|
||||||
|
(set! pref-save-callbacks
|
||||||
|
(let loop ([callbacks pref-save-callbacks])
|
||||||
|
(cond
|
||||||
|
[(null? callbacks) '()]
|
||||||
|
[else
|
||||||
|
(let ([cb (car callbacks)])
|
||||||
|
(if (eq? (list-ref cb 0) k)
|
||||||
|
(cdr callbacks)
|
||||||
|
(cons cb (loop (cdr callbacks)))))]))))
|
||||||
|
|
||||||
|
(define (call-pref-save-callbacks b)
|
||||||
|
(for ([cb (in-list pref-save-callbacks)])
|
||||||
|
((list-ref cb 1) b)))
|
||||||
|
|
||||||
(define (raise-unknown-preference-error sym fmt . args)
|
(define (raise-unknown-preference-error sym fmt . args)
|
||||||
(raise (exn:make-unknown-preference
|
(raise (exn:make-unknown-preference
|
||||||
|
@ -437,6 +464,24 @@ the state transitions / contracts are:
|
||||||
@{@scheme[(preferences:restore-defaults)] restores the users' configuration
|
@{@scheme[(preferences:restore-defaults)] restores the users' configuration
|
||||||
to the default preferences.})
|
to the default preferences.})
|
||||||
|
|
||||||
|
(proc-doc/names
|
||||||
|
preferences:register-save-callback
|
||||||
|
(-> (-> boolean? any) symbol?)
|
||||||
|
(callback)
|
||||||
|
@{Registers @racket[callback] to run twice for each call to @racket[preferences:set]---once
|
||||||
|
before the preferences file is written, with @racket[#t], and once after it is written, with
|
||||||
|
@racket[#f}. Registration returns a key for use with @racket{preferences:unregister-save-callback}.
|
||||||
|
Caveats:
|
||||||
|
@itemize{@item{The callback occurs on whichever thread happened to call @racket[preferences:set].}
|
||||||
|
@item{Pre- and post-write notifications are not necessarily paired; unregistration
|
||||||
|
may cancel the post-write notification before it occurs.}}})
|
||||||
|
|
||||||
|
(proc-doc/names
|
||||||
|
preferences:unregister-save-callback
|
||||||
|
(-> symbol? void?)
|
||||||
|
(key)
|
||||||
|
@{Unregisters the save callback associated with @racket{key}.})
|
||||||
|
|
||||||
(proc-doc/names
|
(proc-doc/names
|
||||||
exn:make-unknown-preference
|
exn:make-unknown-preference
|
||||||
(string? continuation-mark-set? . -> . exn:unknown-preference?)
|
(string? continuation-mark-set? . -> . exn:unknown-preference?)
|
||||||
|
|
|
@ -560,6 +560,7 @@
|
||||||
(λ (l)
|
(λ (l)
|
||||||
(if (memq outer-info-panel l)
|
(if (memq outer-info-panel l)
|
||||||
(begin (unregister-collecting-blit gc-canvas)
|
(begin (unregister-collecting-blit gc-canvas)
|
||||||
|
(unregister-pref-save-callback)
|
||||||
(list rest-panel))
|
(list rest-panel))
|
||||||
l)))]
|
l)))]
|
||||||
[else
|
[else
|
||||||
|
@ -569,6 +570,7 @@
|
||||||
l
|
l
|
||||||
(begin
|
(begin
|
||||||
(register-gc-blit)
|
(register-gc-blit)
|
||||||
|
(register-pref-save-callback)
|
||||||
(list rest-panel outer-info-panel)))))]))
|
(list rest-panel outer-info-panel)))))]))
|
||||||
|
|
||||||
[define close-panel-callback
|
[define close-panel-callback
|
||||||
|
@ -580,6 +582,7 @@
|
||||||
|
|
||||||
(define/augment (on-close)
|
(define/augment (on-close)
|
||||||
(unregister-collecting-blit gc-canvas)
|
(unregister-collecting-blit gc-canvas)
|
||||||
|
(unregister-pref-save-callback)
|
||||||
(close-panel-callback)
|
(close-panel-callback)
|
||||||
(memory-cleanup)
|
(memory-cleanup)
|
||||||
(inner (void) on-close))
|
(inner (void) on-close))
|
||||||
|
@ -637,6 +640,12 @@
|
||||||
[(<= n 99) (format "0~a" n)]
|
[(<= n 99) (format "0~a" n)]
|
||||||
[else (number->string n)]))
|
[else (number->string n)]))
|
||||||
|
|
||||||
|
(define pref-save-canvas #f)
|
||||||
|
(when checkout-or-nightly?
|
||||||
|
(set! pref-save-canvas (new pref-save-canvas% [parent (get-info-panel)])))
|
||||||
|
|
||||||
|
[define lock-canvas (make-object lock-canvas% (get-info-panel))]
|
||||||
|
|
||||||
; only for checkouts and nightly build users
|
; only for checkouts and nightly build users
|
||||||
(when show-memory-text?
|
(when show-memory-text?
|
||||||
(let* ([panel (new horizontal-panel%
|
(let* ([panel (new horizontal-panel%
|
||||||
|
@ -657,7 +666,6 @@
|
||||||
(set! memory-canvases (remq ec memory-canvases))))
|
(set! memory-canvases (remq ec memory-canvases))))
|
||||||
(send panel stretchable-width #f)))
|
(send panel stretchable-width #f)))
|
||||||
|
|
||||||
[define lock-canvas (make-object lock-canvas% (get-info-panel))]
|
|
||||||
[define gc-canvas (make-object bday-click-canvas% (get-info-panel) '(border))]
|
[define gc-canvas (make-object bday-click-canvas% (get-info-panel) '(border))]
|
||||||
(define/private (register-gc-blit)
|
(define/private (register-gc-blit)
|
||||||
(let ([onb (icon:get-gc-on-bitmap)]
|
(let ([onb (icon:get-gc-on-bitmap)]
|
||||||
|
@ -670,6 +678,25 @@
|
||||||
(send onb get-height)
|
(send onb get-height)
|
||||||
onb offb))))
|
onb offb))))
|
||||||
|
|
||||||
|
(define pref-save-callback-registration #f)
|
||||||
|
(inherit get-eventspace)
|
||||||
|
(define/private (register-pref-save-callback)
|
||||||
|
(when pref-save-canvas
|
||||||
|
(set! pref-save-callback-registration
|
||||||
|
(preferences:register-save-callback
|
||||||
|
(λ (start?)
|
||||||
|
(cond
|
||||||
|
[(eq? (current-thread) (eventspace-handler-thread (get-eventspace)))
|
||||||
|
(send pref-save-canvas set-on? start?)]
|
||||||
|
[else
|
||||||
|
(queue-callback
|
||||||
|
(λ ()
|
||||||
|
(send pref-save-canvas set-on? start?)))]))))))
|
||||||
|
(define/private (unregister-pref-save-callback)
|
||||||
|
(when pref-save-callback-registration
|
||||||
|
(preferences:unregister-save-callback pref-save-callback-registration)))
|
||||||
|
(register-pref-save-callback)
|
||||||
|
|
||||||
(unless (preferences:get 'framework:show-status-line)
|
(unless (preferences:get 'framework:show-status-line)
|
||||||
(send super-root change-children
|
(send super-root change-children
|
||||||
(λ (l)
|
(λ (l)
|
||||||
|
@ -2415,14 +2442,16 @@
|
||||||
(define/override (get-editor%) (text:searching-mixin (super get-editor%)))
|
(define/override (get-editor%) (text:searching-mixin (super get-editor%)))
|
||||||
(super-new)))
|
(super-new)))
|
||||||
|
|
||||||
(define memory-canvases '())
|
(define checkout-or-nightly?
|
||||||
(define show-memory-text?
|
|
||||||
(or (with-handlers ([exn:fail:filesystem? (λ (x) #f)])
|
(or (with-handlers ([exn:fail:filesystem? (λ (x) #f)])
|
||||||
(directory-exists? (collection-path "repo-time-stamp")))
|
(directory-exists? (collection-path "repo-time-stamp")))
|
||||||
(with-handlers ([exn:fail:filesystem? (λ (x) #f)])
|
(with-handlers ([exn:fail:filesystem? (λ (x) #f)])
|
||||||
(let ([fw (collection-path "framework")])
|
(let ([fw (collection-path "framework")])
|
||||||
(directory-exists? (build-path fw 'up 'up ".git"))))))
|
(directory-exists? (build-path fw 'up 'up ".git"))))))
|
||||||
|
|
||||||
|
(define memory-canvases '())
|
||||||
|
(define show-memory-text? checkout-or-nightly?)
|
||||||
|
|
||||||
(define bday-click-canvas%
|
(define bday-click-canvas%
|
||||||
(class canvas%
|
(class canvas%
|
||||||
(define/override (on-event evt)
|
(define/override (on-event evt)
|
||||||
|
@ -2434,6 +2463,32 @@
|
||||||
[else (super on-event evt)]))
|
[else (super on-event evt)]))
|
||||||
(super-new)))
|
(super-new)))
|
||||||
|
|
||||||
|
(define pref-save-canvas%
|
||||||
|
(class canvas%
|
||||||
|
(define on? #f)
|
||||||
|
(define indicator "P")
|
||||||
|
(define/override (on-paint)
|
||||||
|
(cond
|
||||||
|
[on?
|
||||||
|
(let-values ([(cw ch) (get-client-size)])
|
||||||
|
(send (get-dc) draw-text indicator
|
||||||
|
(- (/ cw 2) (/ indicator-width 2))
|
||||||
|
(- (/ ch 2) (/ indicator-height 2))))]))
|
||||||
|
(define/public (set-on? new-on?)
|
||||||
|
(set! on? new-on?)
|
||||||
|
(send (get-dc) erase)
|
||||||
|
(on-paint)
|
||||||
|
(flush))
|
||||||
|
|
||||||
|
(inherit get-dc flush get-client-size min-width)
|
||||||
|
(super-new [stretchable-width #f]
|
||||||
|
[style '(transparent)])
|
||||||
|
|
||||||
|
(define-values (indicator-width indicator-height)
|
||||||
|
(let-values ([(tw th _1 _2) (send (get-dc) get-text-extent indicator)])
|
||||||
|
(values tw th)))
|
||||||
|
(min-width (+ (inexact->exact (ceiling indicator-width)) 4))))
|
||||||
|
|
||||||
(define basic% (register-group-mixin (basic-mixin frame%)))
|
(define basic% (register-group-mixin (basic-mixin frame%)))
|
||||||
(define size-pref% (size-pref-mixin basic%))
|
(define size-pref% (size-pref-mixin basic%))
|
||||||
(define info% (info-mixin basic%))
|
(define info% (info-mixin basic%))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user