io-extra 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|