clisp patch by Pixel // pinterface

master
dlichteblau 2007-07-07 15:25:09 +00:00
parent 9dacb12767
commit 78eea24562
7 changed files with 94 additions and 21 deletions

View File

@ -1,6 +1,7 @@
Copyright (C) 2001, 2003 Eric Marsden Copyright (C) 2001, 2003 Eric Marsden
Copyright (C) ???? Jochen Schmidt Copyright (C) ???? Jochen Schmidt
Copyright (C) 2005 David Lichteblau Copyright (C) 2005 David Lichteblau
Copyright (C) 2007 Pixel // pinterface
* License first changed by Eric Marsden, Jochen Schmidt, and David Lichteblau * License first changed by Eric Marsden, Jochen Schmidt, and David Lichteblau
from plain LGPL to Lisp-LGPL in December 2005. from plain LGPL to Lisp-LGPL in December 2005.

View File

@ -2,6 +2,7 @@
;;; ;;;
;;; Copyright (C) 2001, 2003 Eric Marsden ;;; Copyright (C) 2001, 2003 Eric Marsden
;;; Copyright (C) 2005 David Lichteblau ;;; Copyright (C) 2005 David Lichteblau
;;; Copyright (C) 2007 Pixel // pinterface
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt." ;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
;;; ;;;
;;; See LICENSE for details. ;;; See LICENSE for details.
@ -19,5 +20,8 @@
(:file "reload") (:file "reload")
(:file "conditions") (:file "conditions")
(:file "ffi") (:file "ffi")
(:file "ffi-buffer-all")
#-clisp (:file "ffi-buffer")
#+clisp (:file "ffi-buffer-clisp")
(:file "streams") (:file "streams")
(:file "bio"))) (:file "bio")))

12
ffi-buffer-all.lisp Normal file
View File

@ -0,0 +1,12 @@
(in-package :cl+ssl)
(defconstant +initial-buffer-size+ 2048)
(declaim
(inline
make-buffer
buffer-length
buffer-elt
set-buffer-elt
v/b-replace
b/v-replace))

29
ffi-buffer-clisp.lisp Normal file
View File

@ -0,0 +1,29 @@
(in-package :cl+ssl)
(defun make-buffer (size)
(cffi-sys:%foreign-alloc size))
(defun buffer-length (buf)
(declare (ignore buf))
+initial-buffer-size+)
(defun buffer-elt (buf index)
(ffi:memory-as buf 'ffi:uint8 index))
(defun set-buffer-elt (buf index val)
(setf (ffi:memory-as buf 'ffi:uint8 index) val))
(defsetf buffer-elt set-buffer-elt)
(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) (end2 +initial-buffer-size+))
(replace
vec
(ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end2 start2))) start2)
:start1 start1
:end1 end1))
(defun b/v-replace (buf vec &key (start1 0) (end1 +initial-buffer-size+) (start2 0) end2)
(setf
(ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end1 start1))) start1)
(subseq vec start2 end2)))
(defmacro with-pointer-to-vector-data ((ptr buf) &body body)
`(let ((,ptr ,buf))
,@body))

22
ffi-buffer.lisp Normal file
View File

@ -0,0 +1,22 @@
(in-package :cl+ssl)
(defun make-buffer (size)
(cffi-sys::make-shareable-byte-vector size))
(defun buffer-length (buf)
(length buf))
(defun buffer-elt (buf index)
(elt buf index))
(defun set-buffer-elt (buf index val)
(setf (elt buf index) val))
(defsetf buffer-elt set-buffer-elt)
(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) end2)
(replace vec buf :start1 start1 :end1 end1 :start2 start2 :end2 end2))
(defun b/v-replace (buf vec &key (start1 0) end1 (start2 0) end2)
(replace buf vec :start1 start1 :end1 end1 :start2 start2 :end2 end2))
(defmacro with-pointer-to-vector-data ((ptr buf) &body body)
`(cffi-sys::with-pointer-to-vector-data (,ptr ,buf)
,@body))

View File

@ -16,6 +16,12 @@
</ul> </ul>
<h3>News</h3> <h3>News</h3>
<p>
2007-07-07: Improved clisp support, thanks
to <a
href="http://web.kepibu.org/code/lisp/cl+ssl/#faster-clisp">Pixel
// pinterface</a>.
</p>
<p> <p>
2007-01-16: CL+SSL is now available under an MIT-style license. 2007-01-16: CL+SSL is now available under an MIT-style license.
</p> </p>

View File

@ -1,5 +1,6 @@
;;; Copyright (C) 2001, 2003 Eric Marsden ;;; Copyright (C) 2001, 2003 Eric Marsden
;;; Copyright (C) 2005 David Lichteblau ;;; Copyright (C) 2005 David Lichteblau
;;; Copyright (C) 2007 Pixel // pinterface
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt." ;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
;;; ;;;
;;; See LICENSE for details. ;;; See LICENSE for details.
@ -9,8 +10,6 @@
(in-package :cl+ssl) (in-package :cl+ssl)
(defconstant +initial-buffer-size+ 2048)
(defclass ssl-stream (defclass ssl-stream
(fundamental-binary-input-stream (fundamental-binary-input-stream
fundamental-binary-output-stream fundamental-binary-output-stream
@ -22,13 +21,13 @@
:initform nil :initform nil
:accessor ssl-stream-handle) :accessor ssl-stream-handle)
(output-buffer (output-buffer
:initform (cffi-sys::make-shareable-byte-vector +initial-buffer-size+) :initform (make-buffer +initial-buffer-size+)
:accessor ssl-stream-output-buffer) :accessor ssl-stream-output-buffer)
(output-pointer (output-pointer
:initform 0 :initform 0
:accessor ssl-stream-output-pointer) :accessor ssl-stream-output-pointer)
(input-buffer (input-buffer
:initform (cffi-sys::make-shareable-byte-vector +initial-buffer-size+) :initform (make-buffer +initial-buffer-size+)
:accessor ssl-stream-input-buffer) :accessor ssl-stream-input-buffer)
(peeked-byte (peeked-byte
:initform nil :initform nil
@ -70,7 +69,7 @@
(or (ssl-stream-peeked-byte stream) (or (ssl-stream-peeked-byte stream)
(let ((buf (ssl-stream-input-buffer stream))) (let ((buf (ssl-stream-input-buffer stream)))
(handler-case (handler-case
(cffi-sys::with-pointer-to-vector-data (ptr buf) (with-pointer-to-vector-data (ptr buf)
(ensure-ssl-funcall (ssl-stream-socket stream) (ensure-ssl-funcall (ssl-stream-socket stream)
(ssl-stream-handle stream) (ssl-stream-handle stream)
#'ssl-read #'ssl-read
@ -78,7 +77,7 @@
(ssl-stream-handle stream) (ssl-stream-handle stream)
ptr ptr
1) 1)
(elt buf 0)) (buffer-elt buf 0))
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file (ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
:eof))))) :eof)))))
@ -90,11 +89,11 @@
(incf start)) (incf start))
(let ((buf (ssl-stream-input-buffer stream))) (let ((buf (ssl-stream-input-buffer stream)))
(loop (loop
for length = (min (- end start) (length buf)) for length = (min (- end start) (buffer-length buf))
while (plusp length) while (plusp length)
do do
(handler-case (handler-case
(cffi-sys::with-pointer-to-vector-data (ptr buf) (with-pointer-to-vector-data (ptr buf)
(ensure-ssl-funcall (ssl-stream-socket stream) (ensure-ssl-funcall (ssl-stream-socket stream)
(ssl-stream-handle stream) (ssl-stream-handle stream)
#'ssl-read #'ssl-read
@ -102,7 +101,7 @@
(ssl-stream-handle stream) (ssl-stream-handle stream)
ptr ptr
length) length)
(replace thing buf :start1 start :end1 (+ start length)) (v/b-replace thing buf :start1 start :end1 (+ start length))
(incf start length)) (incf start length))
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file (ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
(return)))) (return))))
@ -110,28 +109,28 @@
(defmethod stream-write-byte ((stream ssl-stream) b) (defmethod stream-write-byte ((stream ssl-stream) b)
(let ((buf (ssl-stream-output-buffer stream))) (let ((buf (ssl-stream-output-buffer stream)))
(when (eql (length buf) (ssl-stream-output-pointer stream)) (when (eql (buffer-length buf) (ssl-stream-output-pointer stream))
(force-output stream)) (force-output stream))
(setf (elt buf (ssl-stream-output-pointer stream)) b) (setf (buffer-elt buf (ssl-stream-output-pointer stream)) b)
(incf (ssl-stream-output-pointer stream))) (incf (ssl-stream-output-pointer stream)))
b) b)
(defmethod stream-write-sequence ((stream ssl-stream) thing start end &key) (defmethod stream-write-sequence ((stream ssl-stream) thing start end &key)
(check-type thing (simple-array (unsigned-byte 8) (*))) (check-type thing (simple-array (unsigned-byte 8) (*)))
(let ((buf (ssl-stream-output-buffer stream))) (let ((buf (ssl-stream-output-buffer stream)))
(when (> (+ (- end start) (ssl-stream-output-pointer stream)) (length buf)) (when (> (+ (- end start) (ssl-stream-output-pointer stream)) (buffer-length buf))
;; not enough space left? flush buffer. ;; not enough space left? flush buffer.
(force-output stream) (force-output stream)
;; still doesn't fit? ;; still doesn't fit?
(while (> (- end start) (length buf)) (while (> (- end start) (buffer-length buf))
(replace buf thing :start2 start) (b/v-replace buf thing :start2 start)
(incf start (length buf)) (incf start (buffer-length buf))
(setf (ssl-stream-output-pointer stream) (length buf)) (setf (ssl-stream-output-pointer stream) (buffer-length buf))
(force-output stream))) (force-output stream)))
(replace buf thing (b/v-replace buf thing
:start1 (ssl-stream-output-pointer stream) :start1 (ssl-stream-output-pointer stream)
:start2 start :start2 start
:end2 end) :end2 end)
(incf (ssl-stream-output-pointer stream) (- end start))) (incf (ssl-stream-output-pointer stream) (- end start)))
thing) thing)
@ -144,7 +143,7 @@
(handle (ssl-stream-handle stream)) (handle (ssl-stream-handle stream))
(socket (ssl-stream-socket stream))) (socket (ssl-stream-socket stream)))
(when (plusp fill-ptr) (when (plusp fill-ptr)
(cffi-sys::with-pointer-to-vector-data (ptr buf) (with-pointer-to-vector-data (ptr buf)
(ensure-ssl-funcall socket handle #'ssl-write 0.5 handle ptr fill-ptr)) (ensure-ssl-funcall socket handle #'ssl-write 0.5 handle ptr fill-ptr))
(setf (ssl-stream-output-pointer stream) 0)))) (setf (ssl-stream-output-pointer stream) 0))))