[nio-cvs] r67 - in branches/home/psmith/restructure/src: buffer io protocol/yarpc statemachine
psmith at common-lisp.net
psmith at common-lisp.net
Sun Feb 4 20:53:04 UTC 2007
Author: psmith
Date: Sun Feb 4 15:53:04 2007
New Revision: 67
Modified:
branches/home/psmith/restructure/src/buffer/buffer.lisp
branches/home/psmith/restructure/src/buffer/nio-buffer-package.lisp
branches/home/psmith/restructure/src/io/async-fd.lisp
branches/home/psmith/restructure/src/protocol/yarpc/yarpc-packet-factory.lisp
branches/home/psmith/restructure/src/statemachine/state-machine.lisp
Log:
client side large packet OK
Modified: branches/home/psmith/restructure/src/buffer/buffer.lisp
==============================================================================
--- branches/home/psmith/restructure/src/buffer/buffer.lisp (original)
+++ branches/home/psmith/restructure/src/buffer/buffer.lisp Sun Feb 4 15:53:04 2007
@@ -48,6 +48,9 @@
:initform 0
:accessor buffer-position
:documentation "Index of next element to be read/written 0<=position<=limit")
+ (mark :initarg :position
+ :initform 0
+ :documentation "A marked position")
(buf :initarg :buf
:accessor buffer-buf)))
@@ -159,6 +162,15 @@
(setf position remaining)
(setf limit capacity))))
+(defmethod mark((bb byte-buffer))
+ :documentation "mark a position in the buffer for subsequent use with reset"
+ (with-slots (position mark) bb
+ (setf mark position)))
+
+(defmethod reset((bb byte-buffer))
+ (with-slots (position mark) bb
+ (setf position mark)))
+
;Used to signal either an attempt has been made to write data to a buffer that is too small using a write (overflow)
@@ -231,9 +243,7 @@
;TODO move string-to-octets into nio-compat
(defmethod bytebuffer-write-string((bb byte-buffer) str &optional (external-format :ascii))
:documentation "Returns number of bytes written to bytebuffer"
- (let ((vec (sb-ext:string-to-octets str :external-format external-format)))
- (when (< (remaining bb) (length vec)) (error 'buffer-too-small-error))
- (bytebuffer-write-vector bb vec)))
+ (bytebuffer-write-vector bb (sb-ext:string-to-octets str :external-format external-format)))
@@ -241,7 +251,7 @@
(assert (<= (buffer-capacity old) (buffer-capacity new)))
(%memcpy (buffer-buf new) (buffer-buf old) (buffer-capacity old))
(setf (buffer-position new) (buffer-position old))
- (setf (buffer-limit new) (buffer-limit old)))
+ (setf (buffer-limit new) (buffer-capacity new)))
;void *memcpy(void *dest, const void *src, size_t n);
(cffi:defcfun ("memcpy" %memcpy) :pointer
Modified: branches/home/psmith/restructure/src/buffer/nio-buffer-package.lisp
==============================================================================
--- branches/home/psmith/restructure/src/buffer/nio-buffer-package.lisp (original)
+++ branches/home/psmith/restructure/src/buffer/nio-buffer-package.lisp Sun Feb 4 15:53:04 2007
@@ -31,6 +31,6 @@
bytebuffer-write-vector bytebuffer-write-string
bytebuffer-read-vector bytebuffer-read-string
bytebuffer-read-8 bytebuffer-read-32 bytebuffer-write-8 bytebuffer-write-32 bytebuffer-insert-8 bytebuffer-insert-32
- flip unflip clear buffer-position copy-buffer buffer-capacity compact
+ flip unflip clear buffer-position copy-buffer buffer-capacity compact mark reset
buffer-too-small-error
))
Modified: branches/home/psmith/restructure/src/io/async-fd.lisp
==============================================================================
--- branches/home/psmith/restructure/src/io/async-fd.lisp (original)
+++ branches/home/psmith/restructure/src/io/async-fd.lisp Sun Feb 4 15:53:04 2007
@@ -152,21 +152,34 @@
(defconstant +MAX-BUFFER-SIZE-BYTES+ (* 1024 1024))
-(defun realloc-buffer (async-fd buffer size)
- (if (>= (length buffer) size)
- t
- (let ((new-buffer (byte-buffer size)))
- (copy-buffer buffer new-buffer)
- (free-buffer buffer)
- (setf (foreign-read-buffer async-fd) new-buffer))))
+
+
+;(let ((buffer (foreign-read-buffer async-fd)))
+; (if (>= (length buffer) size)
+; t
+; (let ((new-buffer (byte-buffer size)))
+; (copy-buffer buffer new-buffer)
+; (free-buffer buffer)
+; (setf (foreign-read-buffer async-fd) new-buffer)))))
+
+
+(defmacro realloc-buffer(async-fd accessor size)
+ `(let ((buffer (,accessor ,async-fd)))
+ (if (>= (buffer-capacity buffer) size)
+ t
+ (let ((new-buffer (byte-buffer ,size)))
+ (copy-buffer buffer new-buffer)
+ (free-buffer buffer)
+ (setf (,accessor ,async-fd) new-buffer)))))
+
;TODO actually deal with buffer allocation failure
(defmethod recommend-buffer-size((async-fd async-fd) mode size)
(if (> size +MAX-BUFFER-SIZE-BYTES+) nil
(ecase mode
- (:read (realloc-buffer (foreign-read-buffer async-fd) size))
- (:write (realloc-buffer (foreign-write-buffer async-fd) size)))))
+ (:read (realloc-buffer async-fd foreign-read-buffer size))
+ (:write (realloc-buffer async-fd foreign-write-buffer size)))))
Modified: branches/home/psmith/restructure/src/protocol/yarpc/yarpc-packet-factory.lisp
==============================================================================
--- branches/home/psmith/restructure/src/protocol/yarpc/yarpc-packet-factory.lisp (original)
+++ branches/home/psmith/restructure/src/protocol/yarpc/yarpc-packet-factory.lisp Sun Feb 4 15:53:04 2007
@@ -74,12 +74,19 @@
(defmethod write-bytes((packet call-method-packet) buf)
#+nio-debug (format-log t "yarpc-packet-factory:write-bytes(call-method-packet) - writing ~%~A to ~%~A~%" packet buf)
- (nio-buffer:bytebuffer-write-8 buf +CALL-METHOD-PACKET-ID+)
- (nio-buffer:bytebuffer-write-32 buf 0) ; come back and write length later
- (nio-buffer:bytebuffer-write-string buf (call-string packet))
- (nio-buffer:bytebuffer-insert-32 buf (buffer-position buf) 1)
+ (nio-buffer:mark buf)
+ (handler-case
+ (progn
+ (nio-buffer:bytebuffer-write-8 buf +CALL-METHOD-PACKET-ID+)
+ (nio-buffer:bytebuffer-write-32 buf 0) ; come back and write length later
+ (nio-buffer:bytebuffer-write-string buf (call-string packet))
+ (nio-buffer:bytebuffer-insert-32 buf (buffer-position buf) 1)
#+nio-debug (format-log t "yarpc-packet-factory:write-bytes(call-method-packet) - written ~%~A ~%" buf)
- )
+ )
+ (buffer-too-small-error (err)
+ (nio-buffer:reset buf)
+ (error err))))
+
(defmethod get-packet-size ((packet call-method-packet))
(+ +yarpc-packet-header-size+
@@ -97,12 +104,18 @@
(defmethod write-bytes((packet method-response-packet) buf)
#+nio-debug (format-log t "yarpc-packet-factory:write-bytes - writing ~A to ~A~%" packet buf)
- (nio-buffer:bytebuffer-write-8 buf +METHOD-RESPONSE-PACKET-ID+)
- (nio-buffer:bytebuffer-write-32 buf 0) ; come back and write length later
- (nio-buffer:bytebuffer-write-string buf (write-to-string (response packet)))
- (nio-buffer:bytebuffer-insert-32 buf (buffer-position buf) 1)
+ (nio-buffer:mark buf)
+ (handler-case
+ (progn
+ (nio-buffer:bytebuffer-write-8 buf +METHOD-RESPONSE-PACKET-ID+)
+ (nio-buffer:bytebuffer-write-32 buf 0) ; come back and write length later
+ (nio-buffer:bytebuffer-write-string buf (write-to-string (response packet)))
+ (nio-buffer:bytebuffer-insert-32 buf (buffer-position buf) 1)
#+nio-debug (format-log t "yarpc-packet-factory:write-bytes - written ~A~%" buf)
-)
+ )
+ (buffer-too-small-error (err)
+ (nio-buffer:reset buf)
+ (error err))))
(defmethod get-packet-size ((packet method-response-packet))
(+ +yarpc-packet-header-size+
Modified: branches/home/psmith/restructure/src/statemachine/state-machine.lisp
==============================================================================
--- branches/home/psmith/restructure/src/statemachine/state-machine.lisp (original)
+++ branches/home/psmith/restructure/src/statemachine/state-machine.lisp Sun Feb 4 15:53:04 2007
@@ -71,9 +71,11 @@
(when outgoing-packet
(handler-case
(write-bytes outgoing-packet foreign-write-buffer)
- (buffer-too-small-error (e)
+ (buffer-too-small-error (write-error1)
(if (recommend-buffer-size sm :write (get-packet-size outgoing-packet))
- (write-bytes outgoing-packet foreign-write-buffer)
+ (handler-case
+ (write-bytes outgoing-packet foreign-write-buffer)
+ (buffer-too-small-error (write-error1) (format t "Failed to write packet after resize (something already in write buffer?, dropping packet ~A~% out buffer:~%~A~%" outgoing-packet foreign-write-buffer)))
(format t "Failed to resize io buffer, dropping packet: ~A~%" outgoing-packet))))))))
More information about the Nio-cvs
mailing list