io-extra 1.2.4 → 1.2.5
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 +4 -0
- data/ext/io/extra.c +52 -17
- data/io-extra.gemspec +2 -2
- data/test/test_io_extra.rb +1 -1
- metadata +4 -4
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 1.2.5 - 23-Mar-2011
|
2
|
+
* Use rb_thread_blocking_region internally for IO.pread and IO.pwrite. Thanks
|
3
|
+
go to Eric Wong for the patch.
|
4
|
+
|
1
5
|
== 1.2.4 - 22-Mar-2011
|
2
6
|
* Use NUM2OFFT where appropriate. Fixes potential 32 vs 64 bit issues. Thanks
|
3
7
|
go to Eric Wong for the spot and patch.
|
data/ext/io/extra.c
CHANGED
@@ -314,6 +314,20 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
|
314
314
|
#endif
|
315
315
|
|
316
316
|
#ifdef HAVE_PREAD
|
317
|
+
struct pread_args {
|
318
|
+
int fd;
|
319
|
+
void *buf;
|
320
|
+
size_t nbyte;
|
321
|
+
off_t offset;
|
322
|
+
};
|
323
|
+
|
324
|
+
static VALUE nogvl_pread(void *ptr)
|
325
|
+
{
|
326
|
+
struct pread_args *args = ptr;
|
327
|
+
|
328
|
+
return (VALUE)pread(args->fd, args->buf, args->nbyte, args->offset);
|
329
|
+
}
|
330
|
+
|
317
331
|
/*
|
318
332
|
* IO.pread(fd, length, offset)
|
319
333
|
*
|
@@ -321,16 +335,22 @@ static VALUE io_set_directio(VALUE self, VALUE v_advice){
|
|
321
335
|
* position in the file without changing the file pointer. And unlike IO.read,
|
322
336
|
* the +fd+, +length+ and +offset+ arguments are all mandatory.
|
323
337
|
*/
|
324
|
-
static VALUE s_io_pread(VALUE klass, VALUE
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
338
|
+
static VALUE s_io_pread(VALUE klass, VALUE fd, VALUE nbyte, VALUE offset){
|
339
|
+
struct pread_args args;
|
340
|
+
VALUE str;
|
341
|
+
ssize_t nread;
|
342
|
+
|
343
|
+
args.fd = NUM2INT(fd);
|
344
|
+
args.nbyte = NUM2ULONG(nbyte);
|
345
|
+
args.offset = NUM2OFFT(offset);
|
346
|
+
str = rb_str_new(NULL, args.nbyte);
|
347
|
+
args.buf = RSTRING_PTR(str);
|
348
|
+
|
349
|
+
nread = (ssize_t)rb_thread_blocking_region(nogvl_pread, &args, RUBY_UBF_IO, 0);
|
330
350
|
|
331
|
-
if (nread
|
351
|
+
if (nread == -1)
|
332
352
|
rb_sys_fail("pread");
|
333
|
-
if ((size_t)nread != nbyte)
|
353
|
+
if ((size_t)nread != args.nbyte)
|
334
354
|
rb_str_set_len(str, nread);
|
335
355
|
|
336
356
|
return str;
|
@@ -360,6 +380,20 @@ static VALUE s_io_pread_ptr(VALUE klass, VALUE v_fd, VALUE v_nbyte, VALUE v_offs
|
|
360
380
|
#endif
|
361
381
|
|
362
382
|
#ifdef HAVE_PWRITE
|
383
|
+
struct pwrite_args {
|
384
|
+
int fd;
|
385
|
+
const void *buf;
|
386
|
+
size_t nbyte;
|
387
|
+
off_t offset;
|
388
|
+
};
|
389
|
+
|
390
|
+
static VALUE nogvl_pwrite(void *ptr)
|
391
|
+
{
|
392
|
+
struct pwrite_args *args = ptr;
|
393
|
+
|
394
|
+
return (VALUE)pwrite(args->fd, args->buf, args->nbyte, args->offset);
|
395
|
+
}
|
396
|
+
|
363
397
|
/*
|
364
398
|
* IO.pwrite(fd, buf, offset)
|
365
399
|
*
|
@@ -371,15 +405,16 @@ static VALUE s_io_pread_ptr(VALUE klass, VALUE v_fd, VALUE v_nbyte, VALUE v_offs
|
|
371
405
|
*
|
372
406
|
* Returns the number of bytes written.
|
373
407
|
*/
|
374
|
-
static VALUE s_io_pwrite(VALUE klass, VALUE
|
408
|
+
static VALUE s_io_pwrite(VALUE klass, VALUE fd, VALUE buf, VALUE offset){
|
375
409
|
ssize_t result;
|
410
|
+
struct pwrite_args args;
|
411
|
+
|
412
|
+
args.fd = NUM2INT(fd);
|
413
|
+
args.buf = RSTRING_PTR(buf);
|
414
|
+
args.nbyte = RSTRING_LEN(buf);
|
415
|
+
args.offset = NUM2OFFT(offset);
|
376
416
|
|
377
|
-
result =
|
378
|
-
NUM2INT(v_fd),
|
379
|
-
RSTRING_PTR(v_buf),
|
380
|
-
RSTRING_LEN(v_buf),
|
381
|
-
NUM2OFFT(v_offset)
|
382
|
-
);
|
417
|
+
result = (ssize_t)rb_thread_blocking_region(nogvl_pwrite, &args, RUBY_UBF_IO, 0);
|
383
418
|
|
384
419
|
if(result == -1)
|
385
420
|
rb_sys_fail("pwrite");
|
@@ -544,6 +579,6 @@ void Init_extra(){
|
|
544
579
|
rb_define_singleton_method(rb_cIO, "writev", s_io_writev, 2);
|
545
580
|
#endif
|
546
581
|
|
547
|
-
/* 1.2.
|
548
|
-
rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_new2("1.2.
|
582
|
+
/* 1.2.5: The version of this library. This a string. */
|
583
|
+
rb_define_const(rb_cIO, "EXTRA_VERSION", rb_str_new2("1.2.5"));
|
549
584
|
}
|
data/io-extra.gemspec
CHANGED
@@ -2,13 +2,13 @@ require 'rubygems'
|
|
2
2
|
require 'rbconfig'
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
|
-
if RbConfig::CONFIG['host_os'] =~ /mswin|dos|win32|cygwin|mingw/i
|
5
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin|dos|win32|cygwin|mingw|windows/i
|
6
6
|
STDERR.puts 'Not supported on this platform. Exiting.'
|
7
7
|
exit(-1)
|
8
8
|
end
|
9
9
|
|
10
10
|
spec.name = 'io-extra'
|
11
|
-
spec.version = '1.2.
|
11
|
+
spec.version = '1.2.5'
|
12
12
|
spec.author = 'Daniel J. Berger'
|
13
13
|
spec.license = 'Artistic 2.0'
|
14
14
|
spec.email = 'djberg96@gmail.com'
|
data/test/test_io_extra.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: io-extra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 1.2.
|
9
|
+
- 5
|
10
|
+
version: 1.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel J. Berger
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-23 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|