[前][次][番号順一覧][スレッド一覧]

ruby-changes:15374

From: nobu <ko1@a...>
Date: Fri, 9 Apr 2010 01:28:35 +0900 (JST)
Subject: [ruby-changes:15374] Ruby:r27265 (trunk): * io.c (internal_{read,write}_func, rb_{read,write}_internal):

nobu	2010-04-09 01:27:42 +0900 (Fri, 09 Apr 2010)

  New Revision: 27265

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27265

  Log:
    * io.c (internal_{read,write}_func, rb_{read,write}_internal):
      preserve errno.  a patch from Takehiro Kubo in [ruby-core:29340].
      [ruby-core:28924]

  Modified files:
    trunk/ChangeLog
    trunk/io.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 27264)
+++ ChangeLog	(revision 27265)
@@ -1,3 +1,9 @@
+Fri Apr  9 01:26:54 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* io.c (internal_{read,write}_func, rb_{read,write}_internal):
+	  preserve errno.  a patch from Takehiro Kubo in [ruby-core:29340].
+	  [ruby-core:28924]
+
 Fri Apr  9 01:12:07 2010  Yusuke Endoh  <mame@t...>
 
 	* lib/irb/completion.rb (CompletionProc): calling the method "methods"
Index: io.c
===================================================================
--- io.c	(revision 27264)
+++ io.c	(revision 27265)
@@ -530,6 +530,7 @@
 
 struct io_internal_struct {
     int fd;
+    int saved_errno;
     void *buf;
     size_t capa;
 };
@@ -538,36 +539,48 @@
 internal_read_func(void *ptr)
 {
     struct io_internal_struct *iis = (struct io_internal_struct*)ptr;
-    return read(iis->fd, iis->buf, iis->capa);
+    ssize_t ret = read(iis->fd, iis->buf, iis->capa);
+    iis->saved_errno = errno;
+    return (VALUE)ret;
 }
 
 static VALUE
 internal_write_func(void *ptr)
 {
     struct io_internal_struct *iis = (struct io_internal_struct*)ptr;
-    return write(iis->fd, iis->buf, iis->capa);
+    ssize_t ret = write(iis->fd, iis->buf, iis->capa);
+    iis->saved_errno = errno;
+    return (VALUE)ret;
 }
 
 static ssize_t
 rb_read_internal(int fd, void *buf, size_t count)
 {
     struct io_internal_struct iis;
+    ssize_t ret;
+
     iis.fd = fd;
     iis.buf = buf;
     iis.capa = count;
 
-    return (ssize_t)rb_thread_blocking_region(internal_read_func, &iis, RUBY_UBF_IO, 0);
+    ret = (ssize_t)rb_thread_blocking_region(internal_read_func, &iis, RUBY_UBF_IO, 0);
+    errno = iis.saved_errno;
+    return ret;
 }
 
 static ssize_t
 rb_write_internal(int fd, void *buf, size_t count)
 {
     struct io_internal_struct iis;
+    ssize_t ret;
+
     iis.fd = fd;
     iis.buf = buf;
     iis.capa = count;
 
-    return (ssize_t)rb_thread_blocking_region(internal_write_func, &iis, RUBY_UBF_IO, 0);
+    ret = (ssize_t)rb_thread_blocking_region(internal_write_func, &iis, RUBY_UBF_IO, 0);
+    errno = iis.saved_errno;
+    return ret;
 }
 
 static long

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]