Feature #4015 » io-advise.patch
configure.in | ||
---|---|---|
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\
|
io.c | ||
---|---|---|
/**********************************************************************
|
||
io.c -
|
||
... | ... | |
#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
|
||
... | ... | |
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);
|
||
... | ... | |
/* 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"));
|