Two compatibility improvements in the SOCKETS library:

1) The buffer types :FULL and :LINE are supported.
2) We create an alias called SB-BSD-SOCKETS
This commit is contained in:
Juan Jose Garcia Ripoll 2009-08-16 10:49:36 +02:00
parent 34012935a0
commit 413b9561cf
7 changed files with 37 additions and 14 deletions

View file

@ -0,0 +1 @@
(require 'SOCKETS)

View file

@ -1173,29 +1173,29 @@ also known as unix-domain sockets."))
"si_set_buffering_mode(ecl_make_stream_from_fd(#0,#1,(enum ecl_smmode)#2,8,ECL_STREAM_DEFAULT_FORMAT,Cnil), #3)"
:one-liner t))
(defmethod socket-make-stream ((socket socket) &rest args &key (buffering-mode NIL))
(defmethod socket-make-stream ((socket socket) &rest args &key (buffering :full))
(declare (ignore args))
(let ((stream (and (slot-boundp socket 'stream)
(slot-value socket 'stream))))
(unless stream
(setf stream (let ((fd (socket-file-descriptor socket)))
(make-stream-from-fd fd #-:wsock :input-output #+:wsock :input-output-wsock
buffering-mode)))
buffering)))
(setf (slot-value socket 'stream) stream)
#+ ignore
(sb-ext:cancel-finalization socket))
stream))
#+:wsock
(defmethod socket-make-stream ((socket named-pipe-socket) &rest args &key (buffering-mode NIL))
(defmethod socket-make-stream ((socket named-pipe-socket) &rest args &key (buffering :full))
(declare (ignore args))
(let ((stream (and (slot-boundp socket 'stream)
(slot-value socket 'stream))))
(unless stream
(setf stream
(let* ((fd (socket-file-descriptor socket))
(in (make-stream-from-fd fd :smm-input buffering-mode))
(out (make-stream-from-fd fd :smm-output buffering-mode)))
(in (make-stream-from-fd fd :smm-input buffering))
(out (make-stream-from-fd fd :smm-output buffering)))
(make-two-way-stream in out)))
(setf (slot-value socket 'stream) stream)
#+ ignore
@ -1519,3 +1519,4 @@ GET-NAME-SERVICE-ERRNO")
;; Finished loading
(provide 'sockets)
(provide 'sb-bsd-sockets)

View file

@ -16,6 +16,13 @@ ECL 9.8.4:
platforms do not support it and GCC does not complain, making reliable
detection impossible.
- For further compatibility with SBCL, ECL now supports two additional
buffer types :FULL and :LINE which are compatible with :FULLY-BUFFERED
and :LINE-BUFFERED (Thanks to Matthew Mondor)
- The sockets library can now be loaded using either (REQUIRE 'SOCKETS)
or (REQUIRE 'SB-BSD-SOCKETS).
ECL 9.8.3:
==========

View file

@ -3749,24 +3749,26 @@ si_set_buffering_mode(cl_object stream, cl_object buffer_mode_symbol)
if (type_of(stream) != t_stream) {
FEerror("Cannot set buffer of ~A", 1, stream);
}
if (buffer_mode_symbol == Cnil) {
if (buffer_mode_symbol == @':none' || Null(buffer_mode_symbol))
buffer_mode = _IONBF;
} else if (buffer_mode_symbol == Ct || buffer_mode_symbol == @':fully-buffered') {
buffer_mode = _IOFBF;
} else if (buffer_mode_symbol == @':line-buffered') {
else if (buffer_mode_symbol == @':line' || buffer_mode_symbol == @':line-buffered')
buffer_mode = _IOLBF;
} else {
else if (buffer_mode_symbol == @':full' || buffer_mode_symbol == @':fully-buffered')
buffer_mode = _IOFBF;
else
FEerror("Not a valid buffering mode: ~A", 1, buffer_mode_symbol);
}
if (mode == smm_output || mode == smm_io || mode == smm_input) {
FILE *fp = IO_STREAM_FILE(stream);
setvbuf(fp, 0, _IONBF, 0);
if (buffer_mode != _IONBF) {
cl_index buffer_size = BUFSIZ;
char *new_buffer = ecl_alloc_atomic(buffer_size);
stream->stream.buffer = new_buffer;
setvbuf(fp, new_buffer, buffer_mode, buffer_size);
}
} else
setvbuf(fp, NULL, _IONBF, 0);
}
@(return stream)
}
@ -4501,7 +4503,7 @@ ecl_open_stream(cl_object fn, enum ecl_smmode smm, cl_object if_exists,
}
x = ecl_make_stream_from_FILE(fn, fp, smm, byte_size, flags,
external_format);
si_set_buffering_mode(x, byte_size? @':fully-buffered' : @':line-buffered');
si_set_buffering_mode(x, byte_size? @':full' : @':line');
} else {
x = ecl_make_file_stream_from_fd(fn, f, smm, byte_size, flags,
external_format);

View file

@ -1630,8 +1630,11 @@ cl_symbols[] = {
{SYS_ "*ACTION-ON-UNDEFINED-VARIABLE*", SI_SPECIAL, NULL, -1, Cnil},
{SYS_ "SET-BUFFERING-MODE", SI_ORDINARY, si_set_buffering_mode, 2, OBJNULL},
{KEY_ "NONE", KEYWORD, NULL, -1, OBJNULL},
{KEY_ "LINE-BUFFERED", KEYWORD, NULL, -1, OBJNULL},
{KEY_ "FULLY-BUFFERED", KEYWORD, NULL, -1, OBJNULL},
{KEY_ "LINE", KEYWORD, NULL, -1, OBJNULL},
{KEY_ "FULL", KEYWORD, NULL, -1, OBJNULL},
{SYS_ "CMP-ENV-REGISTER-MACROLET", SI_ORDINARY, NULL, -1, OBJNULL},

View file

@ -1630,8 +1630,11 @@ cl_symbols[] = {
{SYS_ "*ACTION-ON-UNDEFINED-VARIABLE*",NULL},
{SYS_ "SET-BUFFERING-MODE","si_set_buffering_mode"},
{KEY_ "NONE",NULL},
{KEY_ "LINE-BUFFERED",NULL},
{KEY_ "FULLY-BUFFERED",NULL},
{KEY_ "LINE",NULL},
{KEY_ "FULL",NULL},
{SYS_ "CMP-ENV-REGISTER-MACROLET",NULL},

View file

@ -200,6 +200,12 @@
:builtin
#+(or (NOT :WANTS-DLOPEN) :BUILTIN-SOCKETS) t
#-(or (NOT :WANTS-DLOPEN) :BUILTIN-SOCKETS) nil)
#+(and WANTS-SOCKETS WANTS-DLOPEN (not BUILTIN-SOCKETS))
(build-module "sb-bsd-sockets"
'("ext:sockets;sb-bsd-sockets.lisp")
:dir "build:ext;"
:prefix "EXT"
:builtin nil)
#+WANTS-SERVE-EVENT
(build-module "serve-event"