io-extra 1.0.1 → 1.0.2
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/CHANGES +8 -0
- data/MANIFEST +10 -0
- data/README +47 -11
- data/doc/io_extra.txt +6 -27
- data/ext/extconf.rb +12 -0
- data/{lib → ext}/io/extra.c +13 -10
- data/test/tc_ioextra.rb +23 -37
- metadata +7 -5
- data/extconf.rb +0 -10
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 1.0.2 - 16-Jul-2007
|
2
|
+
* Added a Rakefile with tasks for testing and installation.
|
3
|
+
* Some doc updates and internal reorganization, but no significant code
|
4
|
+
changes.
|
5
|
+
* Fixed an "implicit declaration" build warning (the man page was
|
6
|
+
mistaken about the header file I should use).
|
7
|
+
* Minor updates to the example program.
|
8
|
+
|
1
9
|
== 1.0.1 - 7-Jul-2006
|
2
10
|
* Added a gemspec.
|
3
11
|
* Added or improved the inline rdoc comments in the source.
|
data/MANIFEST
ADDED
data/README
CHANGED
@@ -2,17 +2,20 @@
|
|
2
2
|
The io-extra package provides a few extra IO methods that you may find
|
3
3
|
handy. They are IO.closefrom, IO.fdwalk, IO#directio? and IO#directio=.
|
4
4
|
|
5
|
-
Not supported on MS Windows.
|
5
|
+
Not supported on MS Windows or OS X.
|
6
6
|
|
7
7
|
= Installation
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
== Standard Installation
|
9
|
+
rake test (optional)
|
10
|
+
rake install
|
11
|
+
|
12
|
+
== Gem Installation
|
13
|
+
rake test (optional)
|
14
|
+
rake install_gem
|
12
15
|
|
13
16
|
= Developer's Notes
|
14
|
-
|
15
|
-
pure Ruby version that looks something like this
|
17
|
+
You might be wondering what the difference is between my implementation of
|
18
|
+
IO.closefrom and a pure Ruby version that looks something like this:
|
16
19
|
|
17
20
|
def IO.closefrom(n)
|
18
21
|
0.upto n do |fd|
|
@@ -25,8 +28,8 @@ than only open file descriptors. However, I should note that this only
|
|
25
28
|
applies if your platform supports the closefrom() function. In that case,
|
26
29
|
the only advantage is speed.
|
27
30
|
|
28
|
-
|
29
|
-
pure Ruby version that looks something like this
|
31
|
+
You might also be wondering what the difference is between my implementation
|
32
|
+
of IO.fdwalk and a pure Ruby version that looks something like this:
|
30
33
|
|
31
34
|
def IO.fdwalk(n)
|
32
35
|
ObjectSpace.each_object(File){ |f|
|
@@ -35,5 +38,38 @@ pure Ruby version that looks something like this?
|
|
35
38
|
end
|
36
39
|
|
37
40
|
The primary difference is that this only closes Ruby file objects, not
|
38
|
-
necessarily every filehandle opened by the Ruby process.
|
39
|
-
|
41
|
+
necessarily every filehandle opened by the Ruby process. For example, handles
|
42
|
+
opened via system() calls.
|
43
|
+
|
44
|
+
= Note to OS X Users
|
45
|
+
The OS X platform does not support closefrom(), fdwalk() or directio(). The
|
46
|
+
hand-crafted IO.closefrom function will not work because the getrlimit()
|
47
|
+
function on OS X does not work. Patches welcome.
|
48
|
+
|
49
|
+
= Documentation
|
50
|
+
For further documentation, see the io_extra.txt file or the inline
|
51
|
+
documentation that was generated by RDoc (if you did a gem install).
|
52
|
+
|
53
|
+
= Known Issues
|
54
|
+
None that I'm aware of. Please file any bug reports on the project page
|
55
|
+
at http://www.rubyforge.org/projects/shards.
|
56
|
+
|
57
|
+
= Future Plans
|
58
|
+
I may add the File::O_DIRECT open constant on platforms that support it.
|
59
|
+
|
60
|
+
= License
|
61
|
+
Ruby's
|
62
|
+
|
63
|
+
= Copyright
|
64
|
+
(C) 2003-2007 Daniel J. Berger
|
65
|
+
All Rights Reserved
|
66
|
+
|
67
|
+
= Warranty
|
68
|
+
This package is provided "as is" and without any express or
|
69
|
+
implied warranties, including, without limitation, the implied
|
70
|
+
warranties of merchantability and fitness for a particular purpose.
|
71
|
+
|
72
|
+
= Author
|
73
|
+
Daniel J. Berger
|
74
|
+
djberg96 at nospam at gmail dot com
|
75
|
+
imperator on IRC (irc.freenode.net)
|
data/doc/io_extra.txt
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
= Description
|
2
2
|
The io-extra package provides a few extra IO methods that you may find
|
3
|
-
handy.
|
3
|
+
handy. They are IO.closefrom, IO.fdwalk and IO.directio.
|
4
4
|
|
5
|
-
Not supported on
|
5
|
+
Not supported on MS Windows or OS X.
|
6
6
|
|
7
7
|
= Synopsis
|
8
8
|
require "io/extra"
|
@@ -20,7 +20,7 @@
|
|
20
20
|
IO.closefrom(low_fd)
|
21
21
|
Closes all open file descriptors greater than or equal to 'low_fd'.
|
22
22
|
|
23
|
-
This uses your systems native closefrom() function, if supported.
|
23
|
+
This uses your systems native closefrom() function, if supported. If not,
|
24
24
|
this method uses a slightly less efficient manual approach that uses
|
25
25
|
getrlimit() behind the scenes.
|
26
26
|
|
@@ -34,7 +34,7 @@ IO.fdwalk(low_fd){ |fh| ... }
|
|
34
34
|
= Instance methods
|
35
35
|
IO#directio?
|
36
36
|
Returns true or false, based on whether directio has been set for the
|
37
|
-
current handle.
|
37
|
+
current handle. The default is false.
|
38
38
|
|
39
39
|
Note supported on all platforms.
|
40
40
|
|
@@ -64,26 +64,5 @@ IO::DIRECTIO_OFF
|
|
64
64
|
IO::EXTRA_VERSION
|
65
65
|
Returns the current version number of this package as a String.
|
66
66
|
|
67
|
-
=
|
68
|
-
|
69
|
-
process. You can ignore this.
|
70
|
-
|
71
|
-
= Future Plans
|
72
|
-
Eliminate warnings that occur during the build process.
|
73
|
-
|
74
|
-
= License
|
75
|
-
Ruby's
|
76
|
-
|
77
|
-
= Copyright
|
78
|
-
(C) 2003-2005 Daniel J. Berger
|
79
|
-
All Rights Reserved
|
80
|
-
|
81
|
-
= Warranty
|
82
|
-
This package is provided "as is" and without any express or
|
83
|
-
implied warranties, including, without limitation, the implied
|
84
|
-
warranties of merchantability and fitness for a particular purpose.
|
85
|
-
|
86
|
-
= Author
|
87
|
-
Daniel J. Berger
|
88
|
-
djberg96 at gmail dot com
|
89
|
-
imperator on IRC (irc.freenode.net)
|
67
|
+
= Other documentation
|
68
|
+
See the README for more documentation.
|
data/ext/extconf.rb
ADDED
data/{lib → ext}/io/extra.c
RENAMED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
#ifdef HAVE_DIRECTIO
|
12
12
|
#include <sys/types.h>
|
13
|
-
#include <
|
13
|
+
#include <fcntl.h>
|
14
14
|
#endif
|
15
15
|
|
16
16
|
/*
|
@@ -35,13 +35,13 @@ static VALUE io_closefrom(VALUE klass, VALUE v_low_fd){
|
|
35
35
|
getrlimit(RLIMIT_NOFILE, &limits);
|
36
36
|
lowfd = NUM2INT(v_low_fd);
|
37
37
|
|
38
|
-
for(i = lowfd; i < limits.rlim_max; i++)
|
38
|
+
for(i = lowfd; i < limits.rlim_max; i++)
|
39
39
|
close(i);
|
40
|
-
}
|
41
40
|
#endif
|
42
41
|
return klass;
|
43
42
|
}
|
44
43
|
|
44
|
+
#ifdef HAVE_FDWALK
|
45
45
|
/*
|
46
46
|
* Used by io_fdwalk. Yields a File object back to the block.
|
47
47
|
* It's up to the user to close it.
|
@@ -54,7 +54,6 @@ static int close_func(void* lowfd, int fd){
|
|
54
54
|
return 0;
|
55
55
|
}
|
56
56
|
|
57
|
-
#ifdef HAVE_FDWALK
|
58
57
|
/*
|
59
58
|
* call-seq:
|
60
59
|
* IO.fdwalk(lowfd){ |fh| ... }
|
@@ -98,13 +97,14 @@ static VALUE io_get_directio(VALUE self){
|
|
98
97
|
* IO#directio=(advice)
|
99
98
|
*
|
100
99
|
* Sets the advice for the current file descriptor using directio(). Valid
|
101
|
-
* values are IO::DIRECTIO_ON and IO::DIRECTIO_OFF.
|
100
|
+
* values are IO::DIRECTIO_ON and IO::DIRECTIO_OFF. See the directio(3c) man
|
101
|
+
* page for more information.
|
102
102
|
*
|
103
103
|
* All file descriptors start at DIRECTIO_OFF, unless your filesystem has
|
104
104
|
* been mounted using 'forcedirectio' (and supports that option).
|
105
105
|
*/
|
106
106
|
static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
107
|
-
int fd
|
107
|
+
int fd;
|
108
108
|
int advice = NUM2INT(v_advice);
|
109
109
|
|
110
110
|
/* Only two possible valid values */
|
@@ -114,9 +114,7 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
|
114
114
|
/* Retrieve the current file descriptor in order to pass it to directio() */
|
115
115
|
fd = NUM2INT(rb_funcall(self, rb_intern("fileno"), 0, 0));
|
116
116
|
|
117
|
-
|
118
|
-
|
119
|
-
if(-1 == rv)
|
117
|
+
if(directio(fd, advice) < 0)
|
120
118
|
rb_raise(rb_eStandardError, "The directio() call failed");
|
121
119
|
|
122
120
|
if(advice == DIRECTIO_ON)
|
@@ -139,9 +137,14 @@ void Init_extra(){
|
|
139
137
|
#ifdef HAVE_DIRECTIO
|
140
138
|
rb_define_method(rb_cIO, "directio?", io_get_directio, 0);
|
141
139
|
rb_define_method(rb_cIO, "directio=", io_set_directio, 1);
|
140
|
+
|
141
|
+
/* 0: Applications get the default system behavior when accessing file data. */
|
142
142
|
rb_define_const(rb_cIO, "DIRECTIO_OFF", UINT2NUM(DIRECTIO_OFF));
|
143
|
+
|
144
|
+
/* 1: File data is not cached in the system's memory pages. */
|
143
145
|
rb_define_const(rb_cIO, "DIRECTIO_ON", UINT2NUM(DIRECTIO_ON));
|
144
146
|
#endif
|
145
147
|
|
146
|
-
|
148
|
+
/* 1.0.2: The version of this package. This a string. */
|
149
|
+
rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_new2("1.0.2"));
|
147
150
|
}
|
data/test/tc_ioextra.rb
CHANGED
@@ -1,64 +1,50 @@
|
|
1
|
-
|
1
|
+
###########################################################################
|
2
2
|
# tc_ioextra.rb
|
3
3
|
#
|
4
|
-
# Test suite for the io-extra package.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require "ftools"
|
10
|
-
Dir.chdir("..") if base == "test"
|
11
|
-
Dir.mkdir("io") rescue nil
|
12
|
-
File.copy("extra.so","io")
|
13
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
14
|
-
Dir.chdir("test") rescue nil
|
15
|
-
end
|
16
|
-
|
17
|
-
require "test/unit"
|
18
|
-
require "io/extra"
|
4
|
+
# Test suite for the io-extra package. This test should be run via the
|
5
|
+
# 'rake test' task.
|
6
|
+
###########################################################################
|
7
|
+
require 'test/unit'
|
8
|
+
require 'io/extra'
|
19
9
|
|
20
10
|
class TC_IO_Extra < Test::Unit::TestCase
|
21
11
|
def setup
|
22
|
-
@file =
|
23
|
-
@fh = File.open(@file,
|
12
|
+
@file = 'delete_this.txt'
|
13
|
+
@fh = File.open(@file, 'w+')
|
24
14
|
end
|
25
15
|
|
26
16
|
def test_version
|
27
|
-
assert_equal(
|
17
|
+
assert_equal('1.0.2', IO::EXTRA_VERSION)
|
28
18
|
end
|
29
19
|
|
30
20
|
def test_directio
|
31
|
-
assert_respond_to(@fh
|
21
|
+
assert_respond_to(@fh, :directio?)
|
32
22
|
assert_nothing_raised{ @fh.directio? }
|
33
23
|
end
|
34
|
-
|
24
|
+
|
35
25
|
def test_directio_set
|
36
|
-
assert_respond_to(@fh
|
26
|
+
assert_respond_to(@fh, :directio=)
|
37
27
|
assert_raises(StandardError){ @fh.directio = 99 }
|
38
28
|
assert_nothing_raised{ @fh.directio = IO::DIRECTIO_ON }
|
39
29
|
end
|
40
|
-
|
41
|
-
def
|
42
|
-
|
43
|
-
|
30
|
+
|
31
|
+
def test_constants
|
32
|
+
assert_not_nil(IO::DIRECTIO_ON)
|
33
|
+
assert_not_nil(IO::DIRECTIO_OFF)
|
44
34
|
end
|
45
|
-
|
35
|
+
|
46
36
|
def test_fdwalk
|
47
|
-
assert_respond_to(IO
|
37
|
+
assert_respond_to(IO, :fdwalk)
|
48
38
|
assert_nothing_raised{ IO.fdwalk(0){ } }
|
49
39
|
end
|
50
|
-
|
51
|
-
def
|
52
|
-
|
53
|
-
|
40
|
+
|
41
|
+
def test_closefrom
|
42
|
+
assert_respond_to(IO, :closefrom)
|
43
|
+
assert_nothing_raised{ IO.closefrom(3) }
|
54
44
|
end
|
55
45
|
|
56
|
-
# Ignore EBADF, since some of the tests will close @fh
|
57
46
|
def teardown
|
58
|
-
|
59
|
-
@fh.close
|
60
|
-
rescue Errno::EBADF
|
61
|
-
end
|
47
|
+
@fh.close rescue nil
|
62
48
|
@fh = nil
|
63
49
|
File.delete(@file) if File.exists?(@file)
|
64
50
|
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: io-extra
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date:
|
6
|
+
version: 1.0.2
|
7
|
+
date: 2007-07-16 00:00:00 -06:00
|
8
8
|
summary: Adds the IO.closefrom and IO.fdwalk class methods as well as the IO#directio and IO#directio? instance methods (for those platforms that support them).
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,9 +31,10 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- doc/io_extra.txt
|
33
33
|
- test/tc_ioextra.rb
|
34
|
-
-
|
34
|
+
- ext/io/extra.c
|
35
35
|
- CHANGES
|
36
36
|
- README
|
37
|
+
- MANIFEST
|
37
38
|
test_files:
|
38
39
|
- test/tc_ioextra.rb
|
39
40
|
rdoc_options: []
|
@@ -41,10 +42,11 @@ rdoc_options: []
|
|
41
42
|
extra_rdoc_files:
|
42
43
|
- CHANGES
|
43
44
|
- README
|
45
|
+
- MANIFEST
|
44
46
|
executables: []
|
45
47
|
|
46
48
|
extensions:
|
47
|
-
- extconf.rb
|
49
|
+
- ext/extconf.rb
|
48
50
|
requirements: []
|
49
51
|
|
50
52
|
dependencies: []
|