summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ToDo1
-rw-r--r--ext/socket/socket.c2
-rw-r--r--io.c45
-rw-r--r--misc/ruby-mode.el2
-rw-r--r--rubyio.h2
6 files changed, 45 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 1b5fe5f6b9d..3e2deca7b6a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Sep 20 01:08:02 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
+
+ * io.c (io_fread): should not block other threads.
+
+ * io.c (rb_io_synchronized): renamed from rb_io_unbuffered(); do
+ not call setbuf(NULL) any more.
+
Sat Sep 18 13:45:43 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* stable version 1.4.2 released.
diff --git a/ToDo b/ToDo
index 1ecd529b3ee..1fa2f396aeb 100644
--- a/ToDo
+++ b/ToDo
@@ -34,6 +34,7 @@ Standard Libraries
* Stream or Port, abstract superclass of IO ?
* String#{pred,prev}, String#downto
* optional stepsize argument for succ()
+* Dir.glob(pat){|f|...}
Extension Libraries
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 93a8aacce30..4c0934a87bd 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -115,7 +115,7 @@ sock_new(class, fd)
#endif
fp->f2 = rb_fdopen(fd, "w");
fp->mode = FMODE_READWRITE;
- rb_io_unbuffered(fp);
+ rb_io_synchronized(fp);
return (VALUE)sock;
}
diff --git a/io.c b/io.c
index 93cf75ece23..3aa95e2caec 100644
--- a/io.c
+++ b/io.c
@@ -442,6 +442,29 @@ read_all(port)
return str;
}
+static size_t
+io_fread(ptr, len, f)
+ char *ptr;
+ size_t len;
+ FILE *f;
+{
+ size_t n = len;
+
+ while (n--) {
+ *ptr = getc(f);
+ if (*ptr == EOF) {
+ *ptr = '\0';
+ break;
+ }
+ ptr++;
+ if (!READ_DATA_PENDING(f)) {
+ rb_thread_wait_fd(fileno(f));
+ }
+ }
+
+ return len - n - 1;
+}
+
static VALUE
io_read(argc, argv, io)
int argc;
@@ -465,9 +488,7 @@ io_read(argc, argv, io)
str = rb_str_new(0, len);
READ_CHECK(fptr->f);
- TRAP_BEG;
- n = fread(RSTRING(str)->ptr, 1, len, fptr->f);
- TRAP_END;
+ n = io_fread(RSTRING(str)->ptr, len, fptr->f);
if (n == 0) {
if (feof(fptr->f)) return Qnil;
rb_sys_fail(fptr->path);
@@ -564,9 +585,7 @@ rb_io_gets_internal(argc, argv, io)
}
else {
READ_CHECK(f);
- TRAP_BEG;
- cnt = fread(buf, 1, sizeof(buf), f);
- TRAP_END;
+ cnt = io_fread(buf, sizeof(buf), f);
if (cnt == 0) {
if (ferror(f)) rb_sys_fail(fptr->path);
c = EOF;
@@ -1389,15 +1408,19 @@ pipe_finalize(fptr)
#endif
void
-rb_io_unbuffered(fptr)
+rb_io_synchronized(fptr)
OpenFile *fptr;
{
- if (fptr->f2 == 0) rb_raise(rb_eTypeError, "non-writable fptr");
- if (fptr->f != 0) setbuf(fptr->f, NULL);
- setbuf(fptr->f2, NULL);
fptr->mode |= FMODE_SYNC;
}
+void
+rb_io_unbuffered(fptr)
+ OpenFile *fptr;
+{
+ rb_io_synchronized(fptr);
+}
+
static VALUE
pipe_open(pname, mode)
char *pname, *mode;
@@ -1421,7 +1444,7 @@ pipe_open(pname, mode)
if (modef & FMODE_READABLE) fptr->f = f;
if (modef & FMODE_WRITABLE) {
fptr->f2 = f;
- rb_io_unbuffered(fptr);
+ rb_io_synchronized(fptr);
}
return (VALUE)port;
}
diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el
index 667cad30d9c..2875608f076 100644
--- a/misc/ruby-mode.el
+++ b/misc/ruby-mode.el
@@ -47,7 +47,7 @@
ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)")
)
-(defconst ruby-operator-chars ",.+*/%-&|^~=<>:")
+(defconst ruby-operator-chars "-,.+*/%&|^~=<>:")
(defconst ruby-operator-re (concat "[" ruby-operator-chars "]"))
(defconst ruby-symbol-chars "a-zA-Z0-9_")
diff --git a/rubyio.h b/rubyio.h
index 81f162a0128..f4b72781e5c 100644
--- a/rubyio.h
+++ b/rubyio.h
@@ -54,7 +54,7 @@ int rb_io_mode_flags _((const char*));
void rb_io_check_writable _((OpenFile*));
void rb_io_check_readable _((OpenFile*));
void rb_io_fptr_finalize _((OpenFile*));
-void rb_io_unbuffered _((OpenFile*));
+void rb_io_synchronized _((OpenFile*));
void rb_io_check_closed _((OpenFile*));
void rb_eof_error _((void));