[usocket-cvs] r257 - usocket/trunk/backend

ehuelsmann at common-lisp.net ehuelsmann at common-lisp.net
Wed May 30 21:10:11 UTC 2007


Author: ehuelsmann
Date: Wed May 30 17:10:10 2007
New Revision: 257

Modified:
   usocket/trunk/backend/armedbear.lisp
Log:
Two changes:

1) Change socket slot to contain a channel instead of a socket.
2) Optimize wait-for-input-internal for comming abcl optimization where
   (jmethod ...) is considered constant when it has only string arguments.


Modified: usocket/trunk/backend/armedbear.lisp
==============================================================================
--- usocket/trunk/backend/armedbear.lisp	(original)
+++ usocket/trunk/backend/armedbear.lisp	Wed May 30 17:10:10 2007
@@ -199,7 +199,7 @@
         (describe sock)
          (setf usock
                (make-stream-socket
-                :socket sock
+                :socket jchan
                 :stream (ext:get-socket-stream (jdi:jop-deref sock)
                                                :element-type element-type)))))))
 
@@ -224,16 +224,17 @@
                          (jdi:jcoerce sock-addr
                                       "java.net.SocketAddress")
                          (jdi:jcoerce backlog :int))
-    (make-stream-server-socket sock :element-type element-type)))
+    (make-stream-server-socket chan :element-type element-type)))
 
 (defmethod socket-accept ((socket stream-server-usocket) &key element-type)
   (let* ((jsock (socket socket))
-         (jacc-sock (jdi:do-jmethod-call jsock "accept"))
+         (jacc-chan (jdi:do-jmethod-call jsock "accept"))
          (jacc-stream
-          (ext:get-socket-stream (jdi:jop-deref jacc-sock)
+          (ext:get-socket-stream (jdi:jop-deref
+                                  (jdi:do-jmethod-call jacc-chan "socket"))
                                  :element-type (or element-type
                                                    (element-type socket)))))
-    (make-stream-socket :socket jacc-sock
+    (make-stream-socket :socket jacc-chan
                         :stream jacc-stream)))
 
 ;;(defun print-java-exception (e)
@@ -242,7 +243,7 @@
 
 (defmethod socket-close ((usocket usocket))
   (with-mapped-conditions (usocket)
-    (ext:socket-close (socket usocket))))
+    (jdi:do-method (socket usocket) "close")))
 
 ;; Socket streams are different objects than
 ;; socket streams. Closing the stream flushes
@@ -336,58 +337,79 @@
           (t
            "java.nio.channels.DatagramChannel"))))
 
+(defun socket-channel-class (socket)
+  (cond
+   ((stream-usocket-p socket)
+    "java.nio.channels.SocketChannel")
+   ((stream-server-usocket-p socket)
+    "java.nio.channels.ServerSocketChannel")
+   ((datagram-usocket-p socket)
+    "java.nio.channels.DatagramChannel")))
+
 (defun wait-for-input-internal (sockets &key timeout)
   (let* ((ops (logior (op-read) (op-accept)))
          (selector (jdi:do-jstatic "java.nio.channels.Selector" "open"))
-         (channels
-          (mapcar #'(lambda (s)
-                      (jdi:jcoerce (jdi:do-jmethod-call (socket s) "getChannel")
-                                   "java.nio.channels.SocketChannel"))
-                  sockets)))
+         (channels (mapcar #'socket sockets)))
     (unwind-protect
-       (with-mapped-conditions ()
-          (let ((jfalse (jdi:jcoerce nil :boolean)))
+;;       (with-mapped-conditions ()
+        (progn
+          (let ((jfalse (java:make-immediate-object nil :boolean))
+                (sel (jdi:jop-deref selector)))
             (dolist (channel channels)
-              (jdi:do-jmethod channel "configureBlocking" jfalse)
-              (jdi:do-jmethod channel "register"
-                              selector
-                              (jdi:jcoerce (logand ops (valid-ops channel))
-                                           :int))))
-          (let ((ready-count
-                 (jdi:do-jmethod selector "select" (jdi:jcoerce
-                                                    (truncate (* timeout 1000))
-                                                    :long))))
-            (when (< 0 ready-count)
-              ;; we actually have work to do
-              (let* ((selkeys (jdi:do-jmethod selector "selectedKeys"))
-                     (selkey-iterator (jdi:do-jmethod selkeys "iterator"))
-                     ready-sockets)
-                (loop while (jdi:do-jmethod selkey-iterator "hasNext")
-                      do (let* ((key (jdi:jcoerce
-                                      (jdi:do-jmethod selkey-iterator "next")
-                                      "java.nio.channels.SelectionKey"))
-                                (chan (jdi:do-jmethod key "channel")))
-                           (push (jdi:do-jmethod
-                                  (jdi:jcoerce chan
-                                               (channel-class chan))
-                                             "socket")
-                                 ready-sockets)))
-                (remove-if #'(lambda (s)
-                               (not (member (socket s) ready-sockets
-                                            :key #'jdi:jop-deref
-                                            :test #'jdi:jequals)))
-                                  sockets)))))
+              (let ((chan (jdi:jop-deref channel)))
+                (java:jcall (java:jmethod "java.nio.channels.SelectableChannel"
+                                          "configureBlocking"
+                                          "boolean")
+                            chan jfalse)
+                (java:jcall (java:jmethod "java.nio.channels.SelectableChannel"
+                                          "register"
+                                          "java.nio.channels.Selector" "int")
+                            chan sel (logand ops (valid-ops channel)))))
+            (let ((ready-count
+                   (java:jcall (java:jmethod "java.nio.channels.Selector"
+                                             "select"
+                                             "long")
+                               sel (truncate (* timeout 1000)))))
+              (when (< 0 ready-count)
+                ;; we actually have work to do
+                (let* ((selkeys (jdi:do-jmethod selector "selectedKeys"))
+                       (selkey-iterator (jdi:do-jmethod selkeys "iterator"))
+                       ready-sockets)
+                  (loop while (java:jcall
+                               (java:jmethod "java.util.Iterator" "hasNext")
+                               (jdi:jop-deref selkey-iterator))
+                        do (let* ((key (jdi:jcoerce
+                                        (jdi:do-jmethod selkey-iterator "next")
+                                        "java.nio.channels.SelectionKey"))
+                                  (chan (jdi:jop-deref
+                                         (jdi:do-jmethod key "channel"))))
+                             (push chan ready-sockets)))
+                  (remove-if #'(lambda (s)
+                                 (not (member (jdi:jop-deref (socket s))
+                                              ready-sockets
+                                              :test #'(lambda (x y)
+                                                        (java:jcall (java:jmethod "java.lang.Object"
+                                                                             "equals"
+                                                                             "java.lang.Object")
+                                                                    x y)))))
+                             sockets))))))
       ;; cancel all Selector registrations
       (let* ((keys (jdi:do-jmethod selector "keys"))
              (iter (jdi:do-jmethod keys "iterator")))
-        (loop while (jdi:do-jmethod iter "hasNext")
-              do (jdi:do-jmethod (jdi:jcoerce (jdi:do-jmethod iter "next")
-                                              "java.nio.channels.SelectionKey")
-                                 "cancel")))
+        (loop while (java:jcall (java:jmethod "java.util.Iterator" "hasNext")
+                                (jdi:jop-deref iter))
+              do (java:jcall
+                  (java:jmethod "java.nio.channels.SelectionKey" "cancel")
+                  (java:jcall (java:jmethod "java.util.Iterator" "next")
+                              (jdi:jop-deref iter)))))
       ;; close the selector
-      (jdi:do-jmethod selector "close")
+      (java:jcall (java:jmethod "java.nio.channels.Selector" "close")
+                  (jdi:jop-deref selector))
       ;; make all sockets blocking again.
-      (let ((jtrue (jdi:jcoerce t :boolean)))
+      (let ((jtrue (java:make-immediate-object t :boolean)))
         (dolist (chan channels)
-          (jdi:do-jmethod chan "configureBlocking" jtrue))))))
+          (java:jcall (java:jmethod "java.nio.channels.SelectableChannel"
+                                          "configureBlocking"
+                                          "boolean")
+                      (jdi:jop-deref chan) jtrue))))))
 



More information about the usocket-cvs mailing list