[#33000] [Ruby 1.9-Bug#4014][Open] Case-Sensitivity of Property Names Depends on Regexp Encoding — Run Paint Run Run <redmine@...>

Bug #4014: Case-Sensitivity of Property Names Depends on Regexp Encoding

11 messages 2010/11/01

[#33021] Re: [Ruby 1.9-Feature#4015][Open] File::DIRECT Constant for O_DIRECT — Yukihiro Matsumoto <matz@...>

Hi,

15 messages 2010/11/02

[#33139] [Ruby 1.9-Bug#4044][Open] Regex matching errors when using \W character class and /i option — Ben Hoskings <redmine@...>

Bug #4044: Regex matching errors when using \W character class and /i option

8 messages 2010/11/11

[#33162] Windows Unicode (chcp 65001) Generates incorrect output — Luis Lavena <luislavena@...>

Hello,

10 messages 2010/11/14

[#33246] [Ruby 1.9-Feature#4068][Open] Replace current standard Date/DateTime library with home_run — Jeremy Evans <redmine@...>

Feature #4068: Replace current standard Date/DateTime library with home_run

40 messages 2010/11/17

[#33255] [Ruby 1.9-Feature#4071][Open] support basic auth for Net::HTTP.get requests — "coderrr ." <redmine@...>

Feature #4071: support basic auth for Net::HTTP.get requests

23 messages 2010/11/19

[#33322] [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <redmine@...>

Feature #4085: Refinements and nested methods

94 messages 2010/11/24
[#33345] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/11/25

Hi,

[#33356] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/11/25

Hi,

[#33375] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/11/25

Hi,

[#33381] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/11/25

Hi,

[#33387] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Magnus Holm <judofyr@...> 2010/11/25

Woah, this is very nice stuff! Some comments/questions:

[#33487] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Charles Oliver Nutter <headius@...> 2010/11/30

This is a long response, and for that I apologize. I want to make sure

[#33535] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/12/03

Hi,

[#33519] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/12/02

Hi,

[#33523] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/12/02

Hi,

[#33539] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/12/03

Hi,

[#33543] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/12/03

Hi,

[#33546] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/12/03

Hi,

[#33548] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Yusuke ENDOH <mame@...> 2010/12/03

Hi,

[#33567] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Shugo Maeda <shugo@...> 2010/12/04

Hi,

[#33595] Re: [Ruby 1.9-Feature#4085][Open] Refinements and nested methods — Charles Oliver Nutter <headius@...> 2010/12/06

On Sat, Dec 4, 2010 at 6:32 AM, Shugo Maeda <shugo@ruby-lang.org> wrote:

[#33367] Planning to release 1.8.7 fixes on 12/25 (Japanese timezone) — Urabe Shyouhei <shyouhei@...>

Hello,

20 messages 2010/11/25
[#33439] Re: Planning to release 1.8.7 fixes on 12/25 (Japanese timezone) — Luis Lavena <luislavena@...> 2010/11/27

2010/11/25 Urabe Shyouhei <shyouhei@ruby-lang.org>:

[#33456] [Request for Comment] avoid timer thread — SASADA Koichi <ko1@...>

Hi,

25 messages 2010/11/29
[#35152] Re: [Request for Comment] avoid timer thread — Mark Somerville <mark@...> 2011/02/08

On Mon, Nov 29, 2010 at 11:53:03AM +0900, SASADA Koichi wrote:

[#36077] Re: [Request for Comment] avoid timer thread — Mark Somerville <mark@...> 2011/05/09

On Tue, Feb 08, 2011 at 09:24:13PM +0900, Mark Somerville wrote:

[#36952] Re: [Request for Comment] avoid timer thread — Eric Wong <normalperson@...> 2011/06/10

Mark Somerville <mark@scottishclimbs.com> wrote:

[#37080] Re: [Request for Comment] avoid timer thread — Mark Somerville <mark@...> 2011/06/13

On Sat, Jun 11, 2011 at 05:57:11AM +0900, Eric Wong wrote:

[#37103] Re: [Request for Comment] avoid timer thread — Eric Wong <normalperson@...> 2011/06/13

Mark Somerville <mark@scottishclimbs.com> wrote:

[#37187] Re: [Request for Comment] avoid timer thread — SASADA Koichi <ko1@...> 2011/06/16

(2011/06/14 3:37), Eric Wong wrote:

[#37195] Re: [Request for Comment] avoid timer thread — Eric Wong <normalperson@...> 2011/06/17

SASADA Koichi <ko1@atdot.net> wrote:

[#37205] Re: [Request for Comment] avoid timer thread — Eric Wong <normalperson@...> 2011/06/17

Eric Wong <normalperson@yhbt.net> wrote:

[#33469] [Ruby 1.9-Feature#4100][Open] Improve Net::HTTP documentation — Eric Hodel <redmine@...>

Feature #4100: Improve Net::HTTP documentation

12 messages 2010/11/29

[ruby-core:33075] [Ruby 1.9-Feature#4015] File::DIRECT Constant for O_DIRECT

From: Run Paint Run Run <redmine@...>
Date: 2010-11-05 18:59:12 UTC
List: ruby-core #33075
Issue #4015 has been updated by Run Paint Run Run.

File io-advise.patch added

Last suggestion from me, I promise. ;-)

O_DIRECT is a controversial (<http://lkml.org/lkml/2007/1/11/121>) flag, and Linus and others recommend (<http://lkml.org/lkml/2007/1/10/233>) using madvise(2)/posix_fadvise(2) instead. The latter is, as the name suggests, part of the POSIX standard, avoiding the current problem of defining platform-specific, non-standard flags. Its advantages are summarised in O'Reilly's _Linux System Programming_:

<<A handful of common application workloads can readily benefit from a little well-
intentioned advice to the kernel. Such advice can go a long way toward mitigating
the burden of I/O. With hard disks being so slow, and modern processors being so
fast, every little bit helps, and good advice can go a long way.

Before reading a chunk of a file, a process can provide the POSIX_FADV_WILLNEED hint
to instruct the kernel to read the file into the page cache. The I/O will occur asyn-
chronously, in the background. When the application ultimately accesses the file, the
operation can complete without generating blocking I/O.

Conversely, after reading or writing a lot of data—say, while continuously streaming
video to disk—a process can provide the POSIX_FADV_DONTNEED hint to instruct the
kernel to evict the given chunk of the file from the page cache. A large streaming
operation can continually fill the page cache. If the application never intends to
access the data again, this means the page cache will be filled with superfluous data,
at the expense of potentially more useful data. Thus, it makes sense for a streaming
video application to periodically request that streamed data be evicted from the
cache.

A process that intends to read in an entire file can provide the POSIX_FADV_SEQUENTIAL
hint, instructing the kernel to perform aggressive readahead. Conversely, a process
that knows it is going to access a file randomly, seeking to and fro, can provide the
POSIX_FADV_RANDOM hint, instructing the kernel that readahead will be nothing but
worthless overhead.>>

Implementing posix_fadvise(2) would avoid complicating the logic of `open` any more, and at the same time provide a more general solution than O_DIRECT. The attached patch defines IO#advise as a wrapper around posix_fadvise(2). As this advice is never binding, and #respond_to? returns false for :advise on platforms that don't support it, it is trivial to write portable code that only invokes #advise where supported. Granted, this solution still requires defining constants. However, there is no danger of defining them on all platforms because platforms that don't support this syscall will raise a NotImplementedError for #advise.
----------------------------------------
http://redmine.ruby-lang.org/issues/show/4015

----------------------------------------
http://redmine.ruby-lang.org

Attachments (1)

io-advise.patch (4.92 KB, text/x-diff)
diff --git a/configure.in b/configure.in
index b85b342..7533708 100644
--- a/configure.in
+++ b/configure.in
@@ -1266,7 +1266,7 @@ else
 fi
 AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot getcwd eaccess\
 	      truncate ftruncate chsize times utimes utimensat fcntl lockf lstat\
-	      link symlink readlink readdir_r fsync fdatasync fchown\
+	      link symlink readlink readdir_r fsync fdatasync fchown posix_fadvise\
 	      setitimer setruid seteuid setreuid setresuid setproctitle socketpair\
 	      setrgid setegid setregid setresgid issetugid pause lchown lchmod\
 	      getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
diff --git a/io.c b/io.c
index 4b8d34a..968aa39 100644
--- a/io.c
+++ b/io.c
@@ -1,3 +1,4 @@
+
 /**********************************************************************
 
   io.c -
@@ -1413,6 +1414,78 @@ rb_io_fdatasync(VALUE io)
 #define rb_io_fdatasync rb_f_notimplement
 #endif
 
+#ifdef HAVE_POSIX_FADVISE
+/*
+ *  call-seq:
+ *     ios.advise(advice, offset=0, len=0) -> nil
+ *
+ *  Announce an intention to access data from the current file in a specific
+ *  pattern. This method is implemented in terms of <em>posix_fadvise(2)</em>,
+ *  so on systems that do not support this system call, a
+ *  <code>NotImplementedError</code> is raised.
+
+ * _advice_ is one of the following constants:
+ *  
+ *  * File::POSIX_FADV_NORMAL - No advice to give; the default assumption for 
+ *    an open file.
+ *  * File::POSIX_FADV_SEQUENTIAL - The data will be accessed sequentially: 
+ *    with lower offsets read before higher ones.
+ *  * File::POSIX_FADV_RANDOM - The data will be accessed in random order.
+ *  * File::POSIX_FADV_WILLNEED - The data will be accessed in the near future.
+ *  * FILE::POSIX_FADV_DONTNEED - The data will not be accessed in the near 
+ *    future.
+ *  * File::POSIX_FADV_NOREUSE - The data will only be accessed once.
+ *
+ *  The term _data_ means the region of the current file that begins
+ *  at _offset_ and extends for _len_ bytes. By default, both _offset_
+ *  and _len_ are 0, meaning that the advice applies to the entire
+ *  file.
+ *
+ *  If an error occurs one of the following exceptions will be raised:
+ *
+ *  * <code>IOError</code> - The <code>IO</code> stream is closed.
+ *  * <code>Errno::EBADF</code> - The file descriptor of the current file is
+ *  * invalid.  
+ *  * <code>Errno::EINVAL</code> - An invalid value for _advice_ was
+ *  * given.
+ *  * <code>Errno::ESPIPE</code> - The file descriptor of the current
+ *  * file refers to a FIFO or pipe. (Linux raises <code>Errno::EINVAL</code>
+ *  * in this case).
+ *  * <code>TypeError</code> - One of the arguments given was
+ *  * not an <code>Integer</code>.
+ *  * <code>RangeError</code> - One of the arguments given was too big/small.
+ *  * <code>NotImplementedError</code> - The underlying operating system does
+ *  * not support <em>posix_fadvise(2)</em>.
+ */
+
+static VALUE
+rb_io_advise(int argc, VALUE *argv, VALUE io)
+{
+  off_t offset, len;
+  int advice, rv;
+  VALUE initadvice, initoffset, initlen;
+  rb_io_t *fptr;
+
+  rb_scan_args(argc, argv, "12", &initadvice, &initoffset, &initlen);
+  advice = NUM2INT(initadvice);
+  offset = NIL_P(initoffset) ? 0 : NUM2OFFT(initoffset);
+  len    = NIL_P(initlen)    ? 0 : NUM2OFFT(initlen);
+
+  io = GetWriteIO(io);
+  GetOpenFile(io, fptr);
+
+  if (rv = posix_fadvise(fptr->fd, offset, len, advice)) {
+    /* posix_fadvise(2) doesn't set errno. On success it returns 0; otherwise
+       it returns the error code. */
+    errno = rv;
+    rb_sys_fail_path(fptr->pathv);
+  }
+  return Qnil;
+}
+#else
+#define rb_io_fadvise rb_f_notimplement
+#endif
+
 /*
  *  call-seq:
  *     ios.fileno    -> fixnum
@@ -10048,6 +10121,7 @@ Init_IO(void)
     rb_define_method(rb_cIO, "binmode",  rb_io_binmode_m, 0);
     rb_define_method(rb_cIO, "binmode?", rb_io_binmode_p, 0);
     rb_define_method(rb_cIO, "sysseek", rb_io_sysseek, -1);
+    rb_define_method(rb_cIO, "advise", rb_io_advise, -1);
 
     rb_define_method(rb_cIO, "ioctl", rb_io_ioctl, -1);
     rb_define_method(rb_cIO, "fcntl", rb_io_fcntl, -1);
@@ -10206,6 +10280,24 @@ Init_IO(void)
     /* do not change atime */
     rb_file_const("NOATIME", INT2FIX(O_NOATIME)); /* Linux */
 #endif
+#ifdef POSIX_FADV_NORMAL
+    rb_file_const("POSIX_FADV_NORMAL", INT2FIX(POSIX_FADV_NORMAL));
+#endif
+#ifdef POSIX_FADV_SEQUENTIAL
+    rb_file_const("POSIX_FADV_SEQUENTIAL", INT2FIX(POSIX_FADV_SEQUENTIAL));
+#endif
+#ifdef POSIX_FADV_RANDOM
+    rb_file_const("POSIX_FADV_RANDOM", INT2FIX(POSIX_FADV_RANDOM));
+#endif
+#ifdef POSIX_FADV_WILLNEED
+    rb_file_const("POSIX_FADV_WILLNEED", INT2FIX(POSIX_FADV_WILLNEED));
+#endif
+#ifdef POSIX_FADV_DONTNEED
+    rb_file_const("POSIX_FADV_DONTNEED", INT2FIX(POSIX_FADV_DONTNEED));
+#endif
+#ifdef POSIX_FADV_NOREUSE
+    rb_file_const("POSIX_FADV_NOREUSE", INT2FIX(POSIX_FADV_NOREUSE));
+#endif
 
     sym_mode = ID2SYM(rb_intern("mode"));
     sym_perm = ID2SYM(rb_intern("perm"));

In This Thread