2011/3/29 Eric Wong <normalperson / yhbt.net>: > KOSAKI Motohiro <kosaki.motohiro / gmail.com> wrote: >> 2011/3/28 Eric Wong <normalperson / yhbt.net>: >> > Issue #4532 has been reported by Eric Wong. >> > >> > ---------------------------------------- >> > Feature #4532: [PATCH] add IO#pread and IO#pwrite methods >> > http://redmine.ruby-lang.org/issues/4532 >> > >> > Author: Eric Wong >> > Status: Open >> > Priority: Normal >> > Assignee: >> > Category: core >> > Target version: 1.9.x >> > >> > >> > These methods are useful for safe/concurrent file I/O in >> > multi-thread/process environments and also fairly standard >> > nowadays especially in systems supporting pthreads. >> > >> > pread() is already used internally for IO.copy_stream >> >> Do we really need to introduce new method? Why can't we overload >> IO.read and IO.write? >> too complex? > > IO#read and IO#write take userspace buffers into account which > makes no sense with pread/pwrite. userspace buffer is implementation detail. no? And, If pread is always behave as binary mode read method, your documentation is much misleading. IMHO. * f = File.new("testfile") * f.pread(16, 0) #=> "This is line one" > I considered overloading IO#sysread and IO#syswrite, but it would be > hard for users to determine whether offset is supported on their > platform. ?? Why? Do you have any example? > New methods means IO.method_defined? and IO#respond_to? to be used. OK, fair point. > I'm not a fan of throwing NotImplementedError and faking with lseek() + > read()/write() to be even worse since it loses the atomicity guarantee. I disagree. I dislike following part of your patch. #ifdef HAVE_PREAD rb_define_method(rb_cIO, "pread", rb_io_pread, -1); #endif This is very wrong style for new method. Eventually, *all* users need to call method_defined? before pread. Just NotImplementedError (or lseek emulation) makes much simpler script. > I also considered putting the new methods in File instead of IO, but > sysseek is an IO method so I put it in IO. I agree IO is better.