From 08f78f4408db5b9d70fa2d705deef51a7d8b26ca Mon Sep 17 00:00:00 2001 From: jjgarcia Date: Wed, 16 Mar 2005 16:27:57 +0000 Subject: [PATCH] Rewritten the sockets module using the multiple-values output from C-INLINE --- contrib/sockets/sockets.lisp | 58 +++++++++++++----------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/contrib/sockets/sockets.lisp b/contrib/sockets/sockets.lisp index 80daa684f..0c68b4444 100644 --- a/contrib/sockets/sockets.lisp +++ b/contrib/sockets/sockets.lisp @@ -389,7 +389,7 @@ SB-SYS:MAKE-FD-STREAM.")) (slot-makunbound socket 'stream)) ((= (socket-close-low-level socket) -1) (socket-error "close"))) - (setf (socket-file-descriptor socket) -1)))) + (setf (slot-value socket 'file-descriptor) -1)))) ;; FIXME: How bad is manipulating fillp directly? (defmethod socket-receive ((socket socket) buffer length @@ -500,15 +500,17 @@ static void fill_inet_sockaddr(struct sockaddr_in *sockaddr, int port, :side-effects t)) (socket-error "bind")))) -(Clines -" -static cl_object do_accept_inet(cl_object cl_socket_fd) -{ +(defmethod socket-accept ((socket inet-socket)) + (multiple-value-bind (fd vector) + (c-inline ((socket-file-descriptor socket)) (:int) (values :int :object) +"{ struct sockaddr_in sockaddr; - int socket_fd = fixint(cl_socket_fd); + int socket_fd = fixint(#0); int addr_len = sizeof(struct sockaddr_in); int new_fd = accept(socket_fd, (struct sockaddr*)&sockaddr, &addr_len); + @(return 0) = new_fd; + @(return 1) = Cnil; if (new_fd != -1) { uint32_t ip = ntohl(sockaddr.sin_addr.s_addr); uint16_t port = ntohs(sockaddr.sin_port); @@ -519,19 +521,9 @@ static cl_object do_accept_inet(cl_object cl_socket_fd) aset(vector,2, MAKE_FIXNUM( (ip>>8) & 0xFF)); aset(vector,3, MAKE_FIXNUM( ip & 0xFF )); - NVALUES = 2; - VALUES(0) = make_integer(new_fd); - VALUES(1) = vector; - return VALUES(0); - } else return MAKE_FIXNUM(-1); -} -") - -(c-inline () () t "cl_def_c_function(@do-accept-inet,do_accept_inet,1)" :one-liner t) - -(defmethod socket-accept ((socket inet-socket)) - (multiple-value-bind (fd vector) - (do-accept-inet (socket-file-descriptor socket)) + @(return 1) = vector; + } +}") (cond ((= fd -1) (socket-error "accept")) @@ -628,27 +620,17 @@ also known as unix-domain sockets.")) }")) (socket-error "bind")))) -(Clines - " -static cl_object do_accept_un(cl_object cl_socket_fd) -{ - struct sockaddr_un sockaddr; - int socket_fd = fixint(cl_socket_fd); - int addr_len = sizeof(struct sockaddr_un); - int new_fd = accept(socket_fd, &sockaddr, &addr_len); - - NVALUES = 2; - VALUES(0) = make_integer(new_fd); - VALUES(1) = (new_fd == -1) ? Cnil : make_string_copy(&sockaddr.sun_path); - return VALUES(0); -} -") - -(c-inline () () nil "cl_def_c_function(@do-accept-un,do_accept_un,1)" :one-liner t) - (defmethod socket-accept ((socket local-socket)) (multiple-value-bind (fd name) - (do-accept-un (socket-file-descriptor socket)) + (c-inline ((socket-file-descriptor socket)) (:int) (values :int :object) +"{ + struct sockaddr_un sockaddr; + int socket_fd = fixint(#0); + int addr_len = sizeof(struct sockaddr_un); + int new_fd = accept(socket_fd, &sockaddr, &addr_len); + @(return 0) = new_fd; + @(return 1) = (new_fd == -1) ? Cnil : make_string_copy(&sockaddr.sun_path); +}") (cond ((= fd -1) (socket-error "accept"))