writev 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +8 -0
- data/.gemtest +0 -0
- data/CHANGELOG.rdoc +6 -0
- data/Manifest.txt +10 -0
- data/README.rdoc +52 -0
- data/Rakefile +33 -0
- data/bench.rb +29 -0
- data/ext/writev/extconf.rb +3 -0
- data/ext/writev/writev.c +59 -0
- data/lib/writev.rb +5 -0
- data/test/test_writev.rb +37 -0
- metadata +128 -0
data/.autotest
ADDED
data/.gemtest
ADDED
File without changes
|
data/CHANGELOG.rdoc
ADDED
data/Manifest.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
= writev
|
2
|
+
|
3
|
+
* http://github.com/tenderlove/writev
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
This gem adds the `writev` method to IO. It provides access to the `writev`
|
8
|
+
system call on your IO objects.
|
9
|
+
|
10
|
+
== FEATURES/PROBLEMS:
|
11
|
+
|
12
|
+
* Currently only works on SUS systems and Ruby 1.9
|
13
|
+
|
14
|
+
== SYNOPSIS:
|
15
|
+
|
16
|
+
file = Tempfile.new('foo')
|
17
|
+
file.writev %w{ hello world }
|
18
|
+
assert_equal 'helloworld', File.read(file.path)
|
19
|
+
file.unlink
|
20
|
+
|
21
|
+
== REQUIREMENTS:
|
22
|
+
|
23
|
+
* Ruby 1.9
|
24
|
+
|
25
|
+
== INSTALL:
|
26
|
+
|
27
|
+
* gem install writev
|
28
|
+
|
29
|
+
== LICENSE:
|
30
|
+
|
31
|
+
(The MIT License)
|
32
|
+
|
33
|
+
Copyright (c) 2011 Aaron Patterson
|
34
|
+
|
35
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
36
|
+
a copy of this software and associated documentation files (the
|
37
|
+
'Software'), to deal in the Software without restriction, including
|
38
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
39
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
40
|
+
permit persons to whom the Software is furnished to do so, subject to
|
41
|
+
the following conditions:
|
42
|
+
|
43
|
+
The above copyright notice and this permission notice shall be
|
44
|
+
included in all copies or substantial portions of the Software.
|
45
|
+
|
46
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
47
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
48
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
49
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
50
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
51
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
52
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
gem 'rake-compiler', '>= 0.4.1'
|
7
|
+
require "rake/extensiontask"
|
8
|
+
|
9
|
+
Hoe.plugins.delete :rubyforge
|
10
|
+
Hoe.plugin :minitest
|
11
|
+
Hoe.plugin :gemspec # `gem install hoe-gemspec`
|
12
|
+
Hoe.plugin :git # `gem install hoe-git`
|
13
|
+
Hoe.plugin :debugging # `gem install hoe-debugging`
|
14
|
+
|
15
|
+
Hoe.spec 'writev' do
|
16
|
+
developer('Aaron Patterson', 'aaron@tenderlovemaking.com')
|
17
|
+
self.readme_file = 'README.rdoc'
|
18
|
+
self.history_file = 'CHANGELOG.rdoc'
|
19
|
+
self.extra_rdoc_files = FileList['*.rdoc']
|
20
|
+
|
21
|
+
extra_dev_deps << ['rake-compiler', '>= 0.4.1']
|
22
|
+
|
23
|
+
self.spec_extras = {
|
24
|
+
:extensions => ["ext/writev/extconf.rb"],
|
25
|
+
:required_ruby_version => '>= 1.9.2'
|
26
|
+
}
|
27
|
+
|
28
|
+
Rake::ExtensionTask.new "writev", spec do |ext|
|
29
|
+
ext.lib_dir = File.join(*['lib', ENV['FAT_DIR']].compact)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# vim: syntax=ruby
|
data/bench.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'writev'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
LIST = File.readlines '/usr/share/dict/words'
|
6
|
+
p LIST.length
|
7
|
+
|
8
|
+
Benchmark.bm(7) do |x|
|
9
|
+
x.report('write') {
|
10
|
+
file = Tempfile.new('write')
|
11
|
+
LIST.each { |l| file.write l }
|
12
|
+
file.unlink
|
13
|
+
}
|
14
|
+
x.report('writev') {
|
15
|
+
file = Tempfile.new('write1')
|
16
|
+
LIST.each_slice(IO::IOV_MAX) do |slice|
|
17
|
+
file.writev slice
|
18
|
+
end
|
19
|
+
file.unlink
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
# /* vim: set et sws=2 sw=2: */
|
24
|
+
__END__
|
25
|
+
[aaron@higgins writev (master)]$ ruby -I lib bench.rb
|
26
|
+
235886
|
27
|
+
user system total real
|
28
|
+
write 0.270000 0.010000 0.280000 ( 0.293202)
|
29
|
+
writev 0.020000 0.040000 0.060000 ( 0.087576)
|
data/ext/writev/writev.c
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include <ruby/io.h>
|
3
|
+
#include <sys/uio.h>
|
4
|
+
|
5
|
+
VALUE rb_IOV_MAX;
|
6
|
+
|
7
|
+
static VALUE
|
8
|
+
rb_io_check_io(VALUE io)
|
9
|
+
{
|
10
|
+
return rb_check_convert_type(io, T_FILE, "IO", "to_io");
|
11
|
+
}
|
12
|
+
|
13
|
+
#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path))
|
14
|
+
|
15
|
+
static VALUE rb_writev(VALUE io, VALUE list)
|
16
|
+
{
|
17
|
+
rb_io_t * fptr;
|
18
|
+
struct iovec * iov;
|
19
|
+
long i;
|
20
|
+
ssize_t written;
|
21
|
+
VALUE tmp;
|
22
|
+
|
23
|
+
#ifdef IOV_MAX
|
24
|
+
if(RARRAY_LEN(list) > IOV_MAX)
|
25
|
+
#else
|
26
|
+
if(RARRAY_LEN(list) > NUM2INT(rb_IOV_MAX))
|
27
|
+
#endif
|
28
|
+
rb_raise(rb_eArgError, "list is too long");
|
29
|
+
|
30
|
+
tmp = rb_io_check_io(io);
|
31
|
+
GetOpenFile(tmp, fptr);
|
32
|
+
rb_io_check_writable(fptr);
|
33
|
+
|
34
|
+
iov = xcalloc(RARRAY_LEN(list), sizeof(struct iovec));
|
35
|
+
|
36
|
+
for(i = 0; i < RARRAY_LEN(list); i++) {
|
37
|
+
VALUE string = rb_ary_entry(list, i);
|
38
|
+
iov[i].iov_base = StringValuePtr(string);
|
39
|
+
iov[i].iov_len = RSTRING_LEN(string);
|
40
|
+
}
|
41
|
+
|
42
|
+
if((written = writev(fptr->fd, iov, (int)RARRAY_LEN(list))) == -1)
|
43
|
+
rb_sys_fail_path(fptr->pathv);
|
44
|
+
|
45
|
+
return LONG2FIX(written);
|
46
|
+
}
|
47
|
+
|
48
|
+
void Init_writev()
|
49
|
+
{
|
50
|
+
rb_define_method(rb_cIO, "writev", rb_writev, 1);
|
51
|
+
#ifdef IOV_MAX
|
52
|
+
rb_IOV_MAX = INT2NUM(IOV_MAX);
|
53
|
+
#else
|
54
|
+
rb_IOV_MAX = INT2NUM(sysconf(_SC_IOV_MAX));
|
55
|
+
#endif
|
56
|
+
rb_define_const(rb_cIO, "IOV_MAX", rb_IOV_MAX);
|
57
|
+
}
|
58
|
+
|
59
|
+
/* vim: set noet sws=4 sw=4: */
|
data/lib/writev.rb
ADDED
data/test/test_writev.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'writev'
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
class TestWritev < MiniTest::Unit::TestCase
|
6
|
+
def test_writev
|
7
|
+
file = Tempfile.new('foo')
|
8
|
+
|
9
|
+
file.writev %w{ hello world }
|
10
|
+
assert_equal 'helloworld', File.read(file.path)
|
11
|
+
file.unlink
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_length
|
15
|
+
file = Tempfile.new('foo')
|
16
|
+
|
17
|
+
assert_equal 'helloworld'.bytesize, file.writev(%w{ hello world })
|
18
|
+
file.unlink
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_fail
|
22
|
+
File.open(__FILE__, 'r') do |f|
|
23
|
+
assert_raises(IOError) do
|
24
|
+
f.writev %w{ hello world }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_list_too_long
|
30
|
+
file = Tempfile.new('foo')
|
31
|
+
assert_raises(ArgumentError) do
|
32
|
+
file.writev %w{ x } * (IO::IOV_MAX + 1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# /* vim: set et sws=2 sw=2: */
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: writev
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Aaron Patterson
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-08-19 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: minitest
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 5
|
29
|
+
segments:
|
30
|
+
- 2
|
31
|
+
- 3
|
32
|
+
version: "2.3"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rake-compiler
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 13
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 4
|
47
|
+
- 1
|
48
|
+
version: 0.4.1
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: hoe
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 17
|
60
|
+
segments:
|
61
|
+
- 2
|
62
|
+
- 9
|
63
|
+
version: "2.9"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
description: |-
|
67
|
+
This gem adds the `writev` method to IO. It provides access to the `writev`
|
68
|
+
system call on your IO objects.
|
69
|
+
email:
|
70
|
+
- aaron@tenderlovemaking.com
|
71
|
+
executables: []
|
72
|
+
|
73
|
+
extensions:
|
74
|
+
- ext/writev/extconf.rb
|
75
|
+
extra_rdoc_files:
|
76
|
+
- Manifest.txt
|
77
|
+
- CHANGELOG.rdoc
|
78
|
+
- README.rdoc
|
79
|
+
files:
|
80
|
+
- .autotest
|
81
|
+
- CHANGELOG.rdoc
|
82
|
+
- Manifest.txt
|
83
|
+
- README.rdoc
|
84
|
+
- Rakefile
|
85
|
+
- bench.rb
|
86
|
+
- ext/writev/extconf.rb
|
87
|
+
- ext/writev/writev.c
|
88
|
+
- lib/writev.rb
|
89
|
+
- test/test_writev.rb
|
90
|
+
- .gemtest
|
91
|
+
homepage: http://github.com/tenderlove/writev
|
92
|
+
licenses: []
|
93
|
+
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options:
|
96
|
+
- --main
|
97
|
+
- README.rdoc
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 55
|
106
|
+
segments:
|
107
|
+
- 1
|
108
|
+
- 9
|
109
|
+
- 2
|
110
|
+
version: 1.9.2
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 3
|
117
|
+
segments:
|
118
|
+
- 0
|
119
|
+
version: "0"
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project: writev
|
123
|
+
rubygems_version: 1.8.8
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: This gem adds the `writev` method to IO
|
127
|
+
test_files:
|
128
|
+
- test/test_writev.rb
|