mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
19990920
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
656cbdf2b7
commit
70a444b0cc
6 changed files with 45 additions and 14 deletions
|
@ -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.
|
||||
|
|
1
ToDo
1
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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
45
io.c
45
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;
|
||||
|
@ -1388,14 +1407,18 @@ pipe_finalize(fptr)
|
|||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
rb_io_synchronized(fptr)
|
||||
OpenFile *fptr;
|
||||
{
|
||||
fptr->mode |= FMODE_SYNC;
|
||||
}
|
||||
|
||||
void
|
||||
rb_io_unbuffered(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;
|
||||
rb_io_synchronized(fptr);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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_")
|
||||
|
|
2
rubyio.h
2
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));
|
||||
|
||||
|
|
Loading…
Reference in a new issue