fadvise 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/extconf.rb +4 -0
- data/ext/fadvise.c +77 -0
- data/test/test.rb +26 -0
- metadata +55 -0
data/ext/extconf.rb
ADDED
data/ext/fadvise.c
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
#include <errno.h>
|
3
|
+
|
4
|
+
static int symbols[6];
|
5
|
+
static VALUE rb_Errno_EINVAL;
|
6
|
+
|
7
|
+
#ifdef HAVE_POSIX_FADVISE
|
8
|
+
|
9
|
+
#define _XOPEN_SOURCE 600
|
10
|
+
#include <fcntl.h>
|
11
|
+
/*
|
12
|
+
* call-seq:
|
13
|
+
* file.fadvise(offset,len,advice) -> file
|
14
|
+
*
|
15
|
+
* Advise the operating system how you intend to use the data in this file,
|
16
|
+
* starting from byte +offset+ and counting +len+ bytes, so that the kernel can
|
17
|
+
* schedule it to be fetched in the background while you do more processing. This
|
18
|
+
* call is intended to avoid blocking later when you actually read the data,
|
19
|
+
* but whether this actually happens is up to the the kernel's IO scheduler.
|
20
|
+
* Valid values for advice are:
|
21
|
+
* * <tt>:normal</tt>
|
22
|
+
* * <tt>:sequential</tt>
|
23
|
+
* * <tt>:random</tt>
|
24
|
+
* * <tt>:no_reuse</tt>
|
25
|
+
* * <tt>:will_need</tt>
|
26
|
+
* * <tt>:dont_need</tt>
|
27
|
+
*
|
28
|
+
* This call does not block.
|
29
|
+
*
|
30
|
+
* See the posix_fadvise(2) manpage for more information about these types of advice.
|
31
|
+
*/
|
32
|
+
static VALUE File_fadvise(VALUE self, VALUE offset, VALUE len, VALUE advice){
|
33
|
+
int fd;
|
34
|
+
int madvice;
|
35
|
+
fd=NUM2INT(rb_funcall(self,rb_intern("fileno"),0));
|
36
|
+
madvice=SYM2ID(advice);
|
37
|
+
if(madvice == symbols[0]) madvice=POSIX_FADV_NORMAL;
|
38
|
+
else if(madvice == symbols[1]) madvice=POSIX_FADV_SEQUENTIAL;
|
39
|
+
else if(madvice == symbols[2]) madvice=POSIX_FADV_RANDOM;
|
40
|
+
else if(madvice == symbols[3]) madvice=POSIX_FADV_NOREUSE;
|
41
|
+
else if(madvice == symbols[4]) madvice=POSIX_FADV_WILLNEED;
|
42
|
+
else if(madvice == symbols[5]) madvice=POSIX_FADV_DONTNEED;
|
43
|
+
else rb_raise(rb_Errno_EINVAL,":%s is not valid advice",rb_id2name(SYM2ID(advice)));
|
44
|
+
|
45
|
+
if (!posix_fadvise(self,NUM2OFFT(offset),NUM2OFFT(len),madvice)){
|
46
|
+
rb_sys_fail(0);
|
47
|
+
}
|
48
|
+
|
49
|
+
return self;
|
50
|
+
}
|
51
|
+
#else
|
52
|
+
//dummy implementation for systems that don't have fadvise
|
53
|
+
//do all the same error checking
|
54
|
+
static VALUE File_fadvise(VALUE self, VALUE offset, VALUE len, VALUE advice){
|
55
|
+
int fd;
|
56
|
+
int madvice;
|
57
|
+
int i;
|
58
|
+
fd=NUM2INT(rb_funcall(self,rb_intern("fileno"),0));
|
59
|
+
madvice=SYM2ID(advice);
|
60
|
+
for (i=0; i<6; ++i){
|
61
|
+
if(madvice == symbols[i]) return self;
|
62
|
+
}
|
63
|
+
rb_raise(rb_Errno_EINVAL,":%s is not valid advice",rb_id2name(SYM2ID(advice)));
|
64
|
+
return self;
|
65
|
+
}
|
66
|
+
#endif
|
67
|
+
|
68
|
+
void Init_fadvise(){
|
69
|
+
rb_Errno_EINVAL = rb_eval_string("Errno::EINVAL");
|
70
|
+
symbols[0]=rb_intern("normal");
|
71
|
+
symbols[1]=rb_intern("sequential");
|
72
|
+
symbols[2]=rb_intern("random");
|
73
|
+
symbols[3]=rb_intern("no_reuse");
|
74
|
+
symbols[4]=rb_intern("will_need");
|
75
|
+
symbols[5]=rb_intern("dont_need");
|
76
|
+
rb_define_method(rb_cFile,"fadvise",File_fadvise,3);
|
77
|
+
}
|
data/test/test.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
$: << File.expand_path(File.dirname(__FILE__)) + '/../ext'
|
5
|
+
require 'fadvise'
|
6
|
+
|
7
|
+
class TestFadvise < Test::Unit::TestCase
|
8
|
+
def test_symbols
|
9
|
+
f=open("/dev/zero")
|
10
|
+
assert_nothing_thrown{ f.fadvise 0,0,:normal }
|
11
|
+
assert_nothing_thrown{ f.fadvise 0,0,:sequential }
|
12
|
+
assert_nothing_thrown{ f.fadvise 0,0,:random }
|
13
|
+
assert_nothing_thrown{ f.fadvise 0,0,:no_reuse }
|
14
|
+
assert_nothing_thrown{ f.fadvise 0,0,:will_need }
|
15
|
+
assert_nothing_thrown{ f.fadvise 0,0,:dont_need }
|
16
|
+
assert_raise(Errno::EINVAL){ f.fadvise 0,0,:foobar }
|
17
|
+
f.close
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_closed
|
21
|
+
f=open("/dev/zero")
|
22
|
+
assert_nothing_thrown{ f.fadvise 0,0,:normal }
|
23
|
+
f.close
|
24
|
+
assert_raise(IOError){ f.fadvise 0,0,:normal }
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fadvise
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "1.0"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ken Bloom
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-09-27 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: kbloom@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ext/extconf.rb
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- ext/fadvise.c
|
26
|
+
- ext/extconf.rb
|
27
|
+
- test/test.rb
|
28
|
+
has_rdoc: true
|
29
|
+
homepage:
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
|
33
|
+
require_paths:
|
34
|
+
- ext
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: "0"
|
40
|
+
version:
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
47
|
+
requirements: []
|
48
|
+
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 1.2.0
|
51
|
+
signing_key:
|
52
|
+
specification_version: 2
|
53
|
+
summary: A binding to the posix_fadvise system call
|
54
|
+
test_files: []
|
55
|
+
|