[#33511] [Ruby 1.9-Bug#4108][Open] irb hangs on Windows with trunk — Heesob Park <redmine@...>
Bug #4108: irb hangs on Windows with trunk
[#33521] [Ruby 1.9-Feature#4111][Open] Add XLIST support to Net::IMAP — Geoff Youngs <redmine@...>
Feature #4111: Add XLIST support to Net::IMAP
[#33530] [Ruby 1.9-Bug#4113][Open] Cannot build trunk with MSVC. — Heesob Park <redmine@...>
Bug #4113: Cannot build trunk with MSVC.
[#33583] Initialization time — SASADA Koichi <ko1@...>
Hi,
[#33605] Why is SyncEnumerator in REXML? — Asher <asher@...>
in 1.8 SyncEnumerator is in lib/generator.rb; in 1.9 it is in lib/rexml/syncenumerator.rb
On Dec 6, 2010, at 11:09 PM, Asher wrote:
If that is the case, it would make sense historically, but doesn't seem to make much sense now, as SyncEnumerator doesn't seem to have any relation to REXML, even if REXML utilizes it.
[#33628] [Ruby 1.8-Bug#4132][Open] Socket.close attempting to close the socket twice — Claudio Villalobos <redmine@...>
Bug #4132: Socket.close attempting to close the socket twice
[#33640] [Ruby 1.9-Bug#4136][Open] Enumerable#reject should not inherit the receiver's instance variables — Hiro Asari <redmine@...>
Bug #4136: Enumerable#reject should not inherit the receiver's instance variables
Issue #4136 has been updated by Marc-Andre Lafortune.
Hi,
[#33648] Why doesn’t StringIO implement #freeze? — Nikolai Weibull <now@...>
IO implements #freeze, but StringIO doesn’t. What’s up with that?
Hi,
On Fri, Dec 31, 2010 at 03:09, Nobuyoshi Nakada <nobu@ruby-lang.org> wrote:
[#33656] [Ruby 1.9-Bug#4141][Open] Tk extension is not accepting any type of parameter combination — Luis Lavena <redmine@...>
Bug #4141: Tk extension is not accepting any type of parameter combination
Hi,
On Sun, Dec 26, 2010 at 10:05 PM, Hidetoshi NAGAI
[#33661] [Ruby 1.9-Feature#4145][Open] The result of UTF-16 encoded string concatenation — Heesob Park <redmine@...>
Feature #4145: The result of UTF-16 encoded string concatenation
Issue #4145 has been updated by Yui NARUSE.
[#33667] [Ruby 1.9-Bug#4149][Open] Documentation submission: syslog standard library — mathew murphy <redmine@...>
Bug #4149: Documentation submission: syslog standard library
Issue #4149 has been updated by mathew murphy.
[#33683] [feature:trunk] Enumerable#categorize — Tanaka Akira <akr@...>
Hi.
2010/12/12 "Martin J. Dst" <duerst@it.aoyama.ac.jp>:
Hello Akira,
2010/12/20 "Martin J. Dst" <duerst@it.aoyama.ac.jp>:
Hi!
2010/12/27 Marc-Andre Lafortune <ruby-core-mailing-list@marc-andre.ca>:
Hi!
[#33687] Towards a standardized AST for Ruby code — Magnus Holm <judofyr@...>
Hey folks,
On Sun, Dec 12, 2010 at 9:55 AM, Magnus Holm <judofyr@gmail.com> wrote:
On Dec 12, 2010, at 17:46 , Charles Oliver Nutter wrote:
On Sun, Dec 12, 2010 at 7:09 PM, Ryan Davis <ryand-ruby@zenspider.com>wrote:
(2010/12/13 1:54), Haase, Konstantin wrote:
(2010/12/13 9:06), Ryan Davis wrote:
On Sun, Dec 12, 2010 at 6:33 PM, Ryan Davis <ryand-ruby@zenspider.com> wrote:
On Dec 14, 2010, at 09:47 , Charles Oliver Nutter wrote:
On Tue, Dec 14, 2010 at 2:54 AM, Haase, Konstantin
[#33690] [Ruby 1.9-Bug#4153][Open] Minitest or ruby bug - wrong return code — Robert Pankowecki <redmine@...>
Bug #4153: Minitest or ruby bug - wrong return code
[#33735] [Ruby 1.9-Bug#4163][Assigned] RubyGems uses deprecated API: YAML.quick_emit. — Yui NARUSE <redmine@...>
Bug #4163: RubyGems uses deprecated API: YAML.quick_emit.
On Thu, Dec 16, 2010 at 04:46:33AM +0900, Yui NARUSE wrote:
[#33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 — Brian Durand <redmine@...>
Bug #4168: WeakRef is unsafe to use in Ruby 1.9
Issue #4168 has been updated by Kurt Stephens.
[#33779] [Ruby 1.9-Bug#4174][Open] 1F1E on rdoc tests — Kouhei Yanagita <redmine@...>
Bug #4174: 1F1E on rdoc tests
[#33801] [Ruby 1.9-Feature#4183][Open] [ext/openssl] Timestamp support — Martin Bosslet <redmine@...>
Feature #4183: [ext/openssl] Timestamp support
On Wed, Dec 22, 2010 at 03:19:12AM +0900, Martin Bosslet wrote:
[#33815] trunk warnflags build issue with curb 0.7.9? — Jon <jon.forums@...>
As this may turn out to be a 3rd party issue rather than a bug, I'd like some feedback.
Hi,
[#33818] [Ruby 1.9-Bug#4188][Open] minitest warnings in 1.9.3 — Aaron Patterson <redmine@...>
Bug #4188: minitest warnings in 1.9.3
[#33825] PATCH: REE fast-thread.patch: stack_free() not called in rb_thread_die(). — Kurt Stephens <ks@...>
http://code.google.com/p/rubyenterpriseedition/issues/detail?id=57
Similar technique might be relevant in MRI 1.9 if fiber/continuation
> Similar technique might be relevant in MRI 1.9 if fiber/continuation stacks
[#33833] Ruby 1.9.2 is going to be released — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
On Thu, Dec 23, 2010 at 9:47 AM, Yuki Sonoda (Yugui) <yugui@yugui.jp> wrote:
On Thu, Dec 23, 2010 at 9:47 AM, Yuki Sonoda (Yugui) <yugui@yugui.jp> wrote:
[#33845] Getting involved in Ruby — Benoit Daloze <eregontp@...>
Hi dear Ruby core team !
[#33846] [Ruby 1.9-Feature#4197][Open] Improvement of the benchmark library — Benoit Daloze <redmine@...>
Feature #4197: Improvement of the benchmark library
Issue #4197 has been updated by Yui NARUSE.
[#33852] [Ruby 1.9-Bug#4199][Open] make test ruby-1.9.2-p0 failed on Solaris10 x86 — Dmitry Perfilyev <redmine@...>
Bug #4199: make test ruby-1.9.2-p0 failed on Solaris10 x86
[#33864] [Backport92-Backport#4200][Open] minitest 2.0.2 on trunk — Ryan Davis <redmine@...>
Backport #4200: minitest 2.0.2 on trunk
Issue #4200 has been updated by Ryan Davis.
[#33880] As platform mantainer - what are my boundaries? — Luis Lavena <luislavena@...>
Hello,
Hello,
On Sun, Dec 26, 2010 at 9:50 PM, U.Nakamura <usa@garbagecollect.jp> wrote:
On Mon, Dec 27, 2010 at 11:05 AM, Luis Lavena <luislavena@gmail.com> wrote:
Luis,
On Wed, Dec 29, 2010 at 1:31 AM, Yugui <yugui@yugui.jp> wrote:
[#33910] [Ruby 1.9-Feature#4211][Open] Converting the Ruby and C API documentation to YARD syntax — Loren Segal <redmine@...>
Feature #4211: Converting the Ruby and C API documentation to YARD syntax
On Dec 26, 2010, at 13:00, Loren Segal wrote:
Issue #4211 has been updated by Yui NARUSE.
On Mon, Dec 27, 2010 at 12:01:00PM +0900, Yui NARUSE wrote:
[#33923] [Ruby 1.9-Bug#4214][Open] Fiddle::WINDOWS == false on Windows — Jon Forums <redmine@...>
Bug #4214: Fiddle::WINDOWS == false on Windows
Issue #4214 has been updated by Luis Lavena.
[#33948] Multi-line comments — Rodrigo Rosenfeld Rosas <rr.rosas@...>
I was always curious about the reasoning Ruby doesn't support
On Mon, Dec 27, 2010 at 8:55 PM, Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com
On 28-12-2010 01:54, Joshua Ballanco wrote:
[#33951] [Ruby 1.9-Bug#4217][Open] irb exits unexpectedly with non-ascii Regexp on Windows — Heesob Park <redmine@...>
Bug #4217: irb exits unexpectedly with non-ascii Regexp on Windows
Issue #4217 has been updated by Heesob Park.
[#33953] my redmine login is not working and wanted to submit a bug — deepak kannan <kannan.deepak@...>
hi,
[#34011] [Backport92-Backport#4228][Open] Backward gemspec compatibility change in r29663 broke rake gems — Luis Lavena <redmine@...>
Backport #4228: Backward gemspec compatibility change in r29663 broke rake gems
[#34023] ruby -h doesn't include --disable-gems — Ryan Davis <ryand-ruby@...>
Is there a reason why ruby -h doesn't show --disable-gems ?
2011/1/4 Ryan Davis <ryand-ruby@zenspider.com>:
On Tue, Jan 4, 2011 at 12:14 AM, KOSAKI Motohiro
[ruby-core:33736] [Ruby 1.9-Feature#4038] IO#advise
Issue #4038 has been updated by Motohiro KOSAKI. File IO-advise-7-kosaki.patch added Fix test failure isssue on !HAVE_POSIX_FADVISE platform (ie windows). ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4038 ---------------------------------------- http://redmine.ruby-lang.org
Attachments (1)
---
configure.in | 2 +-
io.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++
test/ruby/test_io.rb | 34 +++++++++++
3 files changed, 195 insertions(+), 1 deletions(-)
diff --git a/configure.in b/configure.in
index 26ab974..c25fd16 100644
--- a/configure.in
+++ b/configure.in
@@ -1290,7 +1290,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 d5d1220..0aae55b 100644
--- a/io.c
+++ b/io.c
@@ -1,3 +1,4 @@
+
/**********************************************************************
io.c -
@@ -7389,6 +7390,158 @@ select_end(VALUE arg)
}
#endif
+static VALUE sym_normal, sym_sequential, sym_random,
+ sym_willneed, sym_dontneed, sym_noreuse;
+
+#ifdef HAVE_POSIX_FADVISE
+struct io_advise_struct {
+ int fd;
+ off_t offset;
+ off_t len;
+ int advice;
+};
+
+static VALUE
+io_advise_internal(void *arg)
+{
+ struct io_advise_struct *ptr = arg;
+ return posix_fadvise(ptr->fd, ptr->offset, ptr->len, ptr->advice);
+}
+
+static VALUE io_advise_sym_to_const(VALUE sym)
+{
+#ifdef POSIX_FADV_NORMAL
+ if (sym == sym_normal)
+ return INT2NUM(POSIX_FADV_NORMAL);
+#endif
+
+#ifdef POSIX_FADV_RANDOM
+ if (sym == sym_random)
+ return INT2NUM(POSIX_FADV_RANDOM);
+#endif
+
+#ifdef POSIX_FADV_SEQUENTIAL
+ if (sym == sym_sequential)
+ return INT2NUM(POSIX_FADV_SEQUENTIAL);
+#endif
+
+#ifdef POSIX_FADV_WILLNEED
+ if (sym == sym_willneed)
+ return INT2NUM(POSIX_FADV_WILLNEED);
+#endif
+
+#ifdef POSIX_FADV_DONTNEED
+ if (sym == sym_dontneed)
+ return INT2NUM(POSIX_FADV_DONTNEED);
+#endif
+
+#ifdef POSIX_FADV_NOREUSE
+ if (sym == sym_noreuse)
+ return INT2NUM(POSIX_FADV_NOREUSE);
+#endif
+
+ return Qnil;
+}
+
+static VALUE
+do_io_advise(VALUE io, VALUE advice, VALUE offset, VALUE len)
+{
+ int rv;
+ rb_io_t *fptr;
+ struct io_advise_struct ias;
+ VALUE num_adv;
+
+ num_adv = io_advise_sym_to_const(advice);
+
+ /*
+ * The platform doesn't support this hint. We don't raise exception, instead
+ * silently ignore it. Because IO::advise is only hint.
+ */
+ if (num_adv == Qnil)
+ return Qnil;
+
+ io = GetWriteIO(io);
+ GetOpenFile(io, fptr);
+
+ ias.fd = fptr->fd;
+ ias.advice = NUM2INT(num_adv);
+ ias.offset = NIL_P(offset) ? 0 : NUM2OFFT(offset);
+ ias.len = NIL_P(len) ? 0 : NUM2OFFT(len);
+
+ if (rv = (int)rb_thread_blocking_region(io_advise_internal, &ias, RUBY_UBF_IO, 0))
+ /* posix_fadvise(2) doesn't set errno. On success it returns 0; otherwise
+ it returns the error code. */
+ rb_syserr_fail(rv, RSTRING_PTR(fptr->pathv));
+
+ return Qnil;
+}
+
+#endif /* 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. On platforms that do not support the
+ * <em>posix_fadvise(2)</em> system call, this method is a no-op.
+ *
+ * _advice_ is one of the following symbols:
+ *
+ * * :normal - No advice to give; the default assumption for an open file.
+ * * :sequential - The data will be accessed sequentially:
+ * with lower offsets read before higher ones.
+ * * :random - The data will be accessed in random order.
+ * * :willneed - The data will be accessed in the near future.
+ * * :dontneed - The data will not be accessed in the near future.
+ * * :noreuse - The data will only be accessed once.
+ *
+ * The semantics of a piece of advice are platform-dependent. See
+ * <em>man 2 posix_fadvise</em> for details.
+ *
+ * "data" means the region of the current file that begins at
+ * _offset_ and extends for _len_ bytes. If _len_ is 0, the region
+ * ends at the last byte of the file. 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> - Either _advice_ was not a Symbol, or one of the
+ other arguments was not an <code>Integer</code>.
+ * * <code>RangeError</code> - One of the arguments given was too big/small.
+ *
+ * This list is not exhaustive; other Errno:: exceptions are also possible.
+ */
+static VALUE
+rb_io_advise(int argc, VALUE *argv, VALUE io)
+{
+ int rv;
+ VALUE advice, offset, len;
+
+ rb_scan_args(argc, argv, "12", &advice, &offset, &len);
+ if (TYPE(advice) != T_SYMBOL)
+ rb_raise(rb_eTypeError, "advice must be a Symbol");
+
+#ifdef HAVE_POSIX_FADVISE
+ return do_io_advise(io, advice, offset, len);
+#else
+
+ /* for argument check. */
+ NUM2OFFT(offset);
+ NUM2OFFT(len);
+
+ /* Ignore all hint */
+ return Qnil;
+#endif
+}
+
/*
* call-seq:
* IO.select(read_array
@@ -10142,6 +10295,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);
@@ -10318,4 +10472,10 @@ Init_IO(void)
sym_textmode = ID2SYM(rb_intern("textmode"));
sym_binmode = ID2SYM(rb_intern("binmode"));
sym_autoclose = ID2SYM(rb_intern("autoclose"));
+ sym_normal = ID2SYM(rb_intern("normal"));
+ sym_sequential = ID2SYM(rb_intern("sequential"));
+ sym_random = ID2SYM(rb_intern("random"));
+ sym_willneed = ID2SYM(rb_intern("willneed"));
+ sym_dontneed = ID2SYM(rb_intern("dontneed"));
+ sym_noreuse = ID2SYM(rb_intern("noreuse"));
}
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 73a16de..c7dbb6d 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -1722,4 +1722,38 @@ End
end
end
end
+
+ def test_advise
+ t = make_tempfile
+ assert_raise(ArgumentError, "no arguments") { t.advise }
+ %w{normal random sequential willneed dontneed noreuse}.map(&:to_sym).each do |adv|
+ [[0,0], [0, 20], [400, 2]].each do |offset, len|
+ open(make_tempfile.path) do |t|
+ assert_equal(t.advise(adv, offset, len), nil)
+ assert_raise(ArgumentError, "superfluous arguments") do
+ t.advise(adv, offset, len, offset)
+ end
+ assert_raise(TypeError, "wrong type for first argument") do
+ t.advise(adv.to_s, offset, len)
+ end
+ assert_raise(TypeError, "wrong type for last argument") do
+ t.advise(adv, offset, Array(len))
+ end
+ assert_raise(RangeError, "last argument too big") do
+ t.advise(adv, offset, 9999e99)
+ end
+ end
+ assert_raise(IOError, "closed file") do
+ make_tempfile.advise(adv.to_sym, offset, len)
+ end
+ end
+ end
+ %w{Normal rand glark will_need zzzzzzzzzzzz \u2609}.map(&:to_sym).each do |adv|
+ [[0,0], [0, 20], [400, 2]].each do |offset, len|
+ open(make_tempfile.path) do |t|
+ assert_equal(t.advise(adv, offset, len), nil)
+ end
+ end
+ end
+ end
end
--
1.7.0.1