io: make fd-output-port use the fast path
This commit is contained in:
parent
45347465df
commit
6fb4097fef
|
@ -115,28 +115,30 @@
|
||||||
[() (values new-fields new-methods override-methods locals statics properties)]
|
[() (values new-fields new-methods override-methods locals statics properties)]
|
||||||
[((field fld ...) . rest)
|
[((field fld ...) . rest)
|
||||||
(loop #'rest
|
(loop #'rest
|
||||||
(add-procs id (syntax->list #'(fld ...)) "field" #:can-immutable? #t)
|
(append new-fields
|
||||||
new-methods
|
(add-procs id (syntax->list #'(fld ...)) "field" #:can-immutable? #t))
|
||||||
override-methods
|
new-methods override-methods locals statics properties)]
|
||||||
locals
|
|
||||||
statics
|
|
||||||
properties)]
|
|
||||||
[((public method ...) . rest)
|
[((public method ...) . rest)
|
||||||
(loop #'rest
|
(loop #'rest new-fields
|
||||||
new-fields
|
(append new-methods
|
||||||
(add-procs methods-id (syntax->list #'(method ...)) "public")
|
(add-procs methods-id (syntax->list #'(method ...)) "public"))
|
||||||
override-methods
|
override-methods locals statics properties)]
|
||||||
locals
|
|
||||||
statics
|
|
||||||
properties)]
|
|
||||||
[((override method ...) . rest)
|
[((override method ...) . rest)
|
||||||
(loop #'rest new-fields new-methods (syntax->list #'(method ...)) locals statics properties)]
|
(loop #'rest new-fields new-methods
|
||||||
|
(append override-methods (syntax->list #'(method ...)))
|
||||||
|
locals statics properties)]
|
||||||
[((private method ...) . rest)
|
[((private method ...) . rest)
|
||||||
(loop #'rest new-fields new-methods override-methods (syntax->list #'(method ...)) statics properties)]
|
(loop #'rest new-fields
|
||||||
|
new-methods override-methods
|
||||||
|
(append locals (syntax->list #'(method ...)))
|
||||||
|
statics properties)]
|
||||||
[((static method ...) . rest)
|
[((static method ...) . rest)
|
||||||
(loop #'rest new-fields new-methods override-methods locals (syntax->list #'(method ...)) properties)]
|
(loop #'rest new-fields new-methods override-methods locals
|
||||||
|
(append statics (syntax->list #'(method ...)))
|
||||||
|
properties)]
|
||||||
[((property prop ...) . rest)
|
[((property prop ...) . rest)
|
||||||
(loop #'rest new-fields new-methods override-methods locals statics (syntax->list #'((#:property . prop) ...)))]
|
(loop #'rest new-fields new-methods override-methods locals statics
|
||||||
|
(append properties (syntax->list #'((#:property . prop) ...))))]
|
||||||
[(other . _)
|
[(other . _)
|
||||||
(raise-syntax-error #f "unrecognized" stx #'other)]))))
|
(raise-syntax-error #f "unrecognized" stx #'other)]))))
|
||||||
(define all-fields (if super-ci
|
(define all-fields (if super-ci
|
||||||
|
|
|
@ -120,6 +120,29 @@
|
||||||
[buffer-mode 'block]
|
[buffer-mode 'block]
|
||||||
[custodian-reference #f])
|
[custodian-reference #f])
|
||||||
|
|
||||||
|
(static
|
||||||
|
[fast-mode!
|
||||||
|
(lambda (amt) ; amt = not yet added to `offset`
|
||||||
|
(when (eq? buffer-mode 'block)
|
||||||
|
(define e end-pos)
|
||||||
|
(set! buffer bstr)
|
||||||
|
(set! buffer-pos e)
|
||||||
|
(set! buffer-end (bytes-length bstr))
|
||||||
|
(define o offset)
|
||||||
|
(when o
|
||||||
|
(set! offset (- (+ o amt) e)))))]
|
||||||
|
|
||||||
|
[slow-mode!
|
||||||
|
(lambda ()
|
||||||
|
(when buffer
|
||||||
|
(set! buffer #f)
|
||||||
|
(define pos buffer-pos)
|
||||||
|
(set! end-pos pos)
|
||||||
|
(define o offset)
|
||||||
|
(when o
|
||||||
|
(set! offset (+ o pos)))
|
||||||
|
(set! buffer-pos buffer-end)))])
|
||||||
|
|
||||||
(public
|
(public
|
||||||
[on-close (lambda () (void))]
|
[on-close (lambda () (void))]
|
||||||
[raise-write-error
|
[raise-write-error
|
||||||
|
@ -131,6 +154,7 @@
|
||||||
;; Returns `#t` if the buffer is already or successfully flushed
|
;; Returns `#t` if the buffer is already or successfully flushed
|
||||||
[flush-buffer
|
[flush-buffer
|
||||||
(lambda ()
|
(lambda ()
|
||||||
|
(slow-mode!)
|
||||||
(cond
|
(cond
|
||||||
[(not (fx= start-pos end-pos))
|
[(not (fx= start-pos end-pos))
|
||||||
(define n (rktio_write_in rktio fd bstr start-pos end-pos))
|
(define n (rktio_write_in rktio fd bstr start-pos end-pos))
|
||||||
|
@ -184,6 +208,7 @@
|
||||||
;; in atomic mode
|
;; in atomic mode
|
||||||
[write-out
|
[write-out
|
||||||
(lambda (src-bstr src-start src-end nonbuffer/nonblock? enable-break? copy?)
|
(lambda (src-bstr src-start src-end nonbuffer/nonblock? enable-break? copy?)
|
||||||
|
(slow-mode!)
|
||||||
(cond
|
(cond
|
||||||
[(fx= src-start src-end)
|
[(fx= src-start src-end)
|
||||||
;; Flush request
|
;; Flush request
|
||||||
|
@ -194,10 +219,10 @@
|
||||||
(define amt (fxmin (fx- src-end src-start) (fx- (bytes-length bstr) end-pos)))
|
(define amt (fxmin (fx- src-end src-start) (fx- (bytes-length bstr) end-pos)))
|
||||||
(bytes-copy! bstr end-pos src-bstr src-start (fx+ src-start amt))
|
(bytes-copy! bstr end-pos src-bstr src-start (fx+ src-start amt))
|
||||||
(set! end-pos (fx+ end-pos amt))
|
(set! end-pos (fx+ end-pos amt))
|
||||||
(unless nonbuffer/nonblock?
|
|
||||||
(when (eq? buffer-mode 'line)
|
(when (eq? buffer-mode 'line)
|
||||||
;; can temporarily leave atomic mode:
|
;; can temporarily leave atomic mode:
|
||||||
(flush-buffer-fully-if-newline src-bstr src-start src-end enable-break?)))
|
(flush-buffer-fully-if-newline src-bstr src-start src-end enable-break?))
|
||||||
|
(fast-mode! amt)
|
||||||
amt]
|
amt]
|
||||||
[(not (flush-buffer)) ; <- can temporarily leave atomic mode
|
[(not (flush-buffer)) ; <- can temporarily leave atomic mode
|
||||||
#f]
|
#f]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user