From ctian at common-lisp.net Sun Feb 21 03:38:51 2010 From: ctian at common-lisp.net (Chun Tian (binghe)) Date: Sat, 20 Feb 2010 22:38:51 -0500 Subject: [usocket-cvs] r521 - usocket/trunk/backend Message-ID: Author: ctian Date: Sat Feb 20 22:38:51 2010 New Revision: 521 Log: LispWorks: code clean; remove support for LispWorks 3. Modified: usocket/trunk/backend/lispworks.lisp Modified: usocket/trunk/backend/lispworks.lisp ============================================================================== --- usocket/trunk/backend/lispworks.lisp (original) +++ usocket/trunk/backend/lispworks.lisp Sat Feb 20 22:38:51 2010 @@ -6,12 +6,14 @@ (in-package :usocket) (eval-when (:compile-toplevel :load-toplevel :execute) - (require "comm")) + (require "comm") + + #+lispworks3 + (error "LispWorks 3 is not supported by USOCKET.")) ;;; --------------------------------------------------------------------------- ;;; Warn if multiprocessing is not running on Lispworks -#-win32 (defun check-for-multiprocessing-started (&optional errorp) (unless mp:*current-process* (funcall (if errorp 'error 'warn) @@ -21,11 +23,13 @@ 'mp:initialize-multiprocessing 'wait-for-input))) -#-win32 -(check-for-multiprocessing-started) +(eval-when (:load-toplevel :execute) + (check-for-multiprocessing-started)) #+win32 -(fli:register-module "ws2_32") +(eval-when (:load-toplevel :execute) + (fli:register-module "ws2_32") + (comm::ensure-sockets)) (fli:define-foreign-function (get-host-name-internal "gethostname" :source) ((return-string (:reference-return (:ef-mb-string :limit 257))) @@ -359,7 +363,8 @@ :element-type '(unsigned-byte 8) :allocation :static)) -(defvar *message-send-lock* (mp:make-lock)) +(defvar *message-send-lock* + (mp:make-lock :name "USOCKET message send lock")) (defun send-message (socket-fd buffer &optional (length (length buffer)) host service) "Send message to a socket, using sendto()/send()" @@ -368,7 +373,7 @@ (let ((message *message-send-buffer*)) (fli:with-dynamic-foreign-objects ((client-addr (:struct comm::sockaddr_in)) (len :int - #-(or lispworks3 lispworks4 lispworks5.0) + #-(or lispworks4 lispworks5.0) ; <= 5.0 :initial-element (fli:size-of '(:struct comm::sockaddr_in)))) (fli:with-dynamic-lisp-array-pointer (ptr message :type '(:unsigned :byte)) @@ -384,14 +389,15 @@ (defmethod socket-send ((socket datagram-usocket) buffer length &key host port) (let ((s (socket socket))) - (send-message s buffer length (host-to-hbo host) port))) + (send-message s buffer length (and host (host-to-hbo host)) port))) (defvar *message-receive-buffer* (make-array +max-datagram-packet-size+ :element-type '(unsigned-byte 8) :allocation :static)) -(defvar *message-receive-lock* (mp:make-lock)) +(defvar *message-receive-lock* + (mp:make-lock :name "USOCKET message receive lock")) (defun receive-message (socket-fd &optional buffer (length (length buffer)) &key read-timeout (max-buffer-size +max-datagram-packet-size+)) @@ -408,7 +414,7 @@ old-timeout) (fli:with-dynamic-foreign-objects ((client-addr (:struct comm::sockaddr_in)) (len :int - #-(or lispworks3 lispworks4 lispworks5.0) + #-(or lispworks4 lispworks5.0) ; <= 5.0 :initial-element (fli:size-of '(:struct comm::sockaddr_in)))) (fli:with-dynamic-lisp-array-pointer (ptr message :type '(:unsigned :byte)) @@ -531,7 +537,9 @@ (wait-list-waiters wait-list)))) (dolist (x (wait-list-waiters wait-list)) (mp:unnotice-fd (os-socket-handle x))) - wait-list))) + wait-list)) + +) ; end of block ;;; @@ -551,6 +559,7 @@ ;; to resort to system calls to achieve the same thing. ;; Luckily, it provides us access to the raw socket handles (as we ;; wrote the code above. + (defconstant fd-read 1) (defconstant fd-read-bit 0) (defconstant fd-write 2) @@ -603,10 +612,12 @@ :lambda-list nil :result-type :int :module "ws2_32") + (fli:define-foreign-function (wsa-event-close "WSACloseEvent" :source) ((event-object win32-handle)) :result-type :int :module "ws2_32") + (fli:define-foreign-function (wsa-enum-network-events "WSAEnumNetworkEvents" :source) ((socket ws-socket) (event-object win32-handle) @@ -670,7 +681,6 @@ (system:wait-for-single-object (wait-list-%wait wait-list) "Waiting for socket activity" timeout)) (update-ready-and-state-slots (wait-list-waiters wait-list))) - (defun map-network-events (func network-events) (let ((event-map (fli:foreign-slot-value network-events 'network-events)) @@ -691,7 +701,7 @@ (wsa-enum-network-events (os-socket-handle socket) 0 t) (if (zerop rv) (map-network-events #'(lambda (err-code) - (if (zerop err-code) + (if (zerop err-code) (setf (%ready-p socket) t (state socket) :READ) (raise-usock-err err-code socket))) @@ -707,7 +717,8 @@ (unless (null (wait-list-%wait wl)) (wsa-event-close (wait-list-%wait wl))))) - (hcl:add-special-free-action 'free-wait-list) + (eval-when (:load-toplevel :execute) + (hcl:add-special-free-action 'free-wait-list)) (defun %setup-wait-list (wait-list) (hcl:flag-special-free-action wait-list) @@ -716,7 +727,8 @@ (defun %add-waiter (wait-list waiter) (let ((events (etypecase waiter (stream-server-usocket (logior fd-connect fd-accept fd-close)) - (stream-usocket (logior fd-connect fd-read fd-oob fd-close))))) + (stream-usocket (logior fd-connect fd-read fd-oob fd-close)) + (datagram-usocket (logior fd-read))))) (maybe-wsa-error (wsa-event-select (os-socket-handle waiter) (wait-list-%wait wait-list) events) waiter))) @@ -726,4 +738,4 @@ (wsa-event-select (os-socket-handle waiter) (wait-list-%wait wait-list) 0) waiter)) - );; end of WIN32-block +) ; end of WIN32-block