Граф коммитов

1397 Коммитов

Автор SHA1 Сообщение Дата
glass bddde8eee3 * io.c (io_binwrite): use writev(2) to avoid double write if available.
* configure.in: check writev(2)

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44618 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-01-15 11:37:23 +00:00
glass 72385b042d * io.c (io_fwrite): freeze converted str.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44485 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-01-02 07:29:13 +00:00
glass 4e4e65a148 * io.c (io_fwrite): allocate frozen str only when str is not converted.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44471 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-12-31 12:25:16 +00:00
nobu 7566c49068 ruby/ruby.h: RB_BLOCK_CALL_FUNC_ARGLIST
* include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): for declaration
  argument list of rb_block_call_func.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43910 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-29 07:59:14 +00:00
nobu 9f45081627 ruby/ruby.h: add blockarg to rb_block_call_func
* include/ruby/ruby.h (rb_block_call_func): add blockarg.  block
  function can take block argument, e.g., proc {|&blockarg| ...}.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43907 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-29 02:26:48 +00:00
nobu 21f81885ab win32.c: rb_w32_dup2
* win32/win32.c (rb_w32_dup2): extract from rb_cloexec_dup2() and
  redirect_dup2().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43890 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-28 07:15:56 +00:00
zzak c3b3e99953 * io.c: [DOC] ARGF.gets may return nil [Bug #9029] patch by znz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-09 06:01:04 +00:00
glass 05a4d176d6 * io.c (rb_io_open_with_args): use RARRAY_CONST_PTR().
* io.c (rb_scan_open_args): use const qualifier for above.

* io.c (rb_open_file): ditto.

* io.c (rb_io_open_with_args): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43581 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-11-08 04:30:40 +00:00
ko1 c5e08b764e * add RUBY_TYPED_FREE_IMMEDIATELY to data types which only use
safe functions during garbage collection such as xfree().
  On default, T_DATA objects are freed at same points as fianlizers.
  This approach protects issues such as reported by [ruby-dev:35578].
  However, freeing T_DATA objects immediately helps heap usage.
  Most of T_DATA (in other words, most of dfree functions) are safe.
  However, we turned off RUBY_TYPED_FREE_IMMEDIATELY by default
  for safety.
* cont.c: ditto.
* dir.c: ditto.
* encoding.c: ditto.
* enumerator.c: ditto.
* error.c: ditto.
* file.c: ditto.
* gc.c: ditto.
* io.c: ditto.
* iseq.c: ditto.
* marshal.c: ditto.
* parse.y: ditto.
* proc.c: ditto.
* process.c: ditto.
* random.c: ditto.
* thread.c: ditto.
* time.c: ditto.
* transcode.c: ditto.
* variable.c: ditto.
* vm.c: ditto.
* vm_backtrace.c: ditto.
* vm_trace.c: ditto.
* ext/bigdecimal/bigdecimal.c: ditto.
* ext/objspace/objspace.c: ditto.
* ext/stringio/stringio.c: ditto.
* ext/strscan/strscan.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-29 11:16:54 +00:00
nobu de004e3a5c io.c: make IO#reopen("pathname") atomic
* io.c (rb_io_reopen): create a new, temporary FD via rb_sysopen and
  call rb_cloexec_dup2 on it to atomically replace the file fptr->fd
  points to.  This leaves no possible window where fptr->fd is invalid
  to userspace (even for any threads running w/o GVL).  based on the
  patch by Eric Wong <normalperson@yhbt.net> at [ruby-core:57943].
  [Bug #9036]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43373 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-20 06:41:24 +00:00
nobu a2b448106f io.c: use rb_funcallv
* io.c (rb_io_write): use rb_funcallv() instead of rb_funcall() to get
  rid of unnecessary alloca.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43202 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-08 15:34:40 +00:00
nobu cd006f08e2 io.c: use local variables instead of struct members
* io.c (copy_stream_body): move src_io and dst_io back to top level
  and use instead of stp->src and stp->dst.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43158 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-06 18:43:50 +00:00
nobu 99526d0f4e io.c: suppress false uninitialized-variable warning
* io.c (io_ascii8bit_binmode): split from rb_io_ascii8bit_binmode() to
  call with rb_io_t* directly.

* io.c (copy_stream_body): move src_io and dst_io into each blocks
  where those are only used.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-06 13:52:44 +00:00
nobu bda5eac115 io.c: wait child process after close_read
* io.c (rb_io_close_read): duplex IO should wait its child process
  even after close_read.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43117 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-02 07:26:54 +00:00
nobu f0d8be4e2b io.c: get rid of race condition
* io.c (rb_io_close_write): detach tied IO for writing before closing
  to get rid of race condition.  [ruby-list:49598]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43114 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-02 05:20:02 +00:00
nobu a9eca1b20d io.c: keep fptr read-closed
* io.c (rb_io_close_read): keep fptr in write_io to be discarded, to
  fix freed pointer access when it is in use by other threads, and get
  rid of potential memory/fd leak.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43112 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-10-02 05:19:00 +00:00
akr e6fe59e96e [DOC]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-23 12:52:49 +00:00
akr 6876f79b34 [DOC]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43009 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-22 03:43:14 +00:00
akr 42cc596402 [DOC]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43007 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-21 07:52:02 +00:00
nobu 7fff518d53 io.c: [DOC]
* io.c (rb_io_advise): [DOC] adjust indent and fix lists.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43005 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-21 04:42:21 +00:00
nobu 28e50d05d3 io.c: [DOC]
* io.c (rb_f_select): [DOC] adjust indent.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43004 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-21 04:42:19 +00:00
akr fa24a0c5ad [DOC]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43003 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-21 03:50:54 +00:00
kazu dc4b0b4161 * io.c (rb_f_printf): [DOC] add missing parenthesis in rdoc.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42901 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-09-10 03:06:14 +00:00
nobu 8ef0192103 io.c: copy in binary mode
* io.c (copy_stream_body): should write in binary mode.  based on a
  patch by godfat (Lin Jen-Shin) at [ruby-core:56556].
  [ruby-core:56518] [Bug #8767]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42709 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-27 08:03:00 +00:00
nobu 1e238c5aa2 io.c: common oflags
* io.c (copy_stream_body): move common open flags.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42708 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-27 08:02:34 +00:00
tenderlove 988ca60565 * io.c (io_read_nonblock): support non-blocking reads without raising
exceptions. As in: `io.read_nonblock(size, exception: false)`
  [ruby-core:38666] [Feature #5138]
* ext/openssl/ossl_ssl.c (ossl_ssl_read_internal): ditto
* ext/stringio/stringio.c (strio_sysread): ditto
* io.c (rb_io_write_nonblock): support non-blocking writes without
  raising an exception.
* ext/openssl/ossl_ssl.c (ossl_ssl_write_internal): ditto
* test/openssl/test_pair.rb (class OpenSSL): tests
* test/ruby/test_io.rb (class TestIO): ditto
* test/socket/test_nonblock.rb (class TestSocketNonblock): ditto
* test/stringio/test_stringio.rb (class TestStringIO): ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42695 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-26 22:41:44 +00:00
usa d6af2a2b21 * io.c, internal.h (rb_io_flush_raw): new function to select calling
fsync() (on Windows).

* io.c (rb_io_flush_raw): use above function.

* file.c (rb_file_truncate): use above function.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-15 11:53:41 +00:00
usa bc08992a2e * io.c (rb_io_rewind): remove fsync() for Windows to improve the
performance.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42560 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-08-15 08:01:28 +00:00
glass e4b0852ae4 * io.c (io_getpartial): use rb_str_locktmp_ensure().
[ruby-core:56121] [Bug #8669]

* io.c (rb_io_sysread): ditto.

* test/ruby/test_io.rb: add tests for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42214 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-28 11:31:58 +00:00
glass dd8f7a6cfd * string.c: add internal API rb_str_locktmp_ensure().
* io.c (io_fread): use rb_str_locktmp_ensure().
  [ruby-core:56121] [Bug #8669]

* test/ruby/test_io.rb: add a test for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42212 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-28 08:49:25 +00:00
glass 0a7785431c * io.c (interpret_seek_whence): support SEEK_DATA and SEEK_HOLE.
These are whences for lseek(2) supported by Linux since version 3.1.
  [ruby-core:56123] [Feature #8671]

* test/ruby/test_io.rb: Add tests for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42211 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-28 04:06:14 +00:00
glass 3495f2b87a * io.c (appendline): cosmetic change
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41993 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-16 02:25:54 +00:00
glass 8ce3f4beea * io.c (appendline): use READ_CHAR_PENDING_XXX macros and
RSTRING_END().

* io.c (rb_io_getline_1): rewrite nested if statement into one
  statement.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41850 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-09 03:49:49 +00:00
nobu 42a2f89b39 io.c: use built-in encoding indexes
* internal.h: add UTF-{16,32}{BE,LE}.
* io.c (io_strip_bom): use built-in encoding indexes in internal.h.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41742 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-07-02 08:22:34 +00:00
nobu 637d668bca win32: UTF-8 spawn
* io.c (spawnv, spawn): use UTF-8 spawn family.  [Bug #1771]
* process.c (proc_exec_sh, proc_spawn_cmd, proc_spawn_sh): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41709 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-30 01:59:21 +00:00
charliesome fff3589899 * compile.c (make_name_for_block): use PRIsVALUE in format string
instead of %s and RSTRING_PTR to protect objects from being garbage
  collected too soon
* encoding.c (str_to_encindex): ditto
* hash.c (rb_hash_fetch_m): ditto
* io.c (rb_io_reopen): ditto
* parse.y (reg_fragment_check_gen): ditto
* parse.y (reg_compile_gen): ditto
* parse.y (ripper_assert_Qundef): ditto
* re.c (rb_reg_raise): ditto
* ruby.c (set_option_encoding_once): ditto
* vm_eval.c (rb_throw_obj): ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41597 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-24 11:31:21 +00:00
shugo 1f828497d1 * safe.c (rb_set_safe_level, safe_setter): raise an ArgumentError
when $SAFE is set to 4.  $SAFE=4 is now obsolete.
  [ruby-core:55222] [Feature #8468]

* object.c (rb_obj_untrusted, rb_obj_untrust, rb_obj_trust):
  Kernel#untrusted?, untrust, and trust are now deprecated.
  Their behavior is same as tainted?, taint, and untaint,
  respectively.

* include/ruby/ruby.h (OBJ_UNTRUSTED, OBJ_UNTRUST): OBJ_UNTRUSTED()
  and OBJ_UNTRUST() are aliases of OBJ_TAINTED() and OBJ_TAINT(),
  respectively.

* array.c, class.c, debug.c, dir.c, encoding.c, error.c, eval.c,
  ext/curses/curses.c, ext/dbm/dbm.c, ext/dl/cfunc.c,
  ext/dl/cptr.c, ext/dl/dl.c, ext/etc/etc.c, ext/fiddle/fiddle.c,
  ext/fiddle/pointer.c, ext/gdbm/gdbm.c, ext/readline/readline.c,
  ext/sdbm/init.c, ext/socket/ancdata.c, ext/socket/basicsocket.c,
  ext/socket/socket.c, ext/socket/udpsocket.c,
  ext/stringio/stringio.c, ext/syslog/syslog.c, ext/tk/tcltklib.c,
  ext/win32ole/win32ole.c, file.c, gc.c, hash.c, io.c, iseq.c,
  load.c, marshal.c, object.c, proc.c, process.c, random.c, re.c,
  safe.c, string.c, thread.c, transcode.c, variable.c,
  vm_insnhelper.c, vm_method.c, vm_trace.c: remove code for
  $SAFE=4.

* test/dl/test_dl2.rb, test/erb/test_erb.rb,
  test/readline/test_readline.rb,
  test/readline/test_readline_history.rb, test/ruby/test_alias.rb,
  test/ruby/test_array.rb, test/ruby/test_dir.rb,
  test/ruby/test_encoding.rb, test/ruby/test_env.rb,
  test/ruby/test_eval.rb, test/ruby/test_exception.rb,
  test/ruby/test_file_exhaustive.rb, test/ruby/test_hash.rb,
  test/ruby/test_io.rb, test/ruby/test_method.rb,
  test/ruby/test_module.rb, test/ruby/test_object.rb,
  test/ruby/test_pack.rb, test/ruby/test_rand.rb,
  test/ruby/test_regexp.rb, test/ruby/test_settracefunc.rb,
  test/ruby/test_struct.rb, test/ruby/test_thread.rb,
  test/ruby/test_time.rb: remove tests for $SAFE=4.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41259 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-12 14:20:51 +00:00
nobu ab64f23771 io.c: fix 7bit coderange condition
* io.c (io_getc): fix 7bit coderange condition, check if ascii read
  data instead of read length. [ruby-core:55444] [Bug #8516]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41250 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-12 03:44:48 +00:00
akr bd15d4ca78 * internal.h (numberof): Gathered from various files.
* array.c, math.c, thread_pthread.c, iseq.c, enum.c, string.c, io.c,
  load.c, compile.c, struct.c, eval.c, gc.c, parse.y, process.c,
  error.c, ruby.c: Remove the definitions of numberof.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41142 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-07 10:01:19 +00:00
nobu 6db56c86c9 fill rdocs
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41027 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-06-02 03:12:04 +00:00
ktsj edb98f8b91 fix typos. Patch by k_takata.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40825 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-19 03:10:21 +00:00
ko1 83aba04862 * include/ruby/ruby.h: constify RBasic::klass and add
RBASIC_CLASS(obj) macro which returns a class of `obj'.
  This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
* object.c: add new function rb_obj_reveal().
  This function reveal interal (hidden) object by rb_obj_hide().
  Note that do not change class before and after hiding.
  Only permitted example is:
  klass = RBASIC_CLASS(obj);
  rb_obj_hide(obj);
  ....
  rb_obj_reveal(obj, klass);
  TODO: API design. rb_obj_reveal() should be replaced with others.
  TODO: modify constified variables using cast may be harmful for
  compiler's analysis and optimizaton.
  Any idea to prohibt inserting RBasic::klass directly?
  If rename RBasic::klass and force to use RBASIC_CLASS(obj),
  then all codes such as `RBASIC(obj)->klass' will be
  compilation error. Is it acceptable? (We have similar
  experience at Ruby 1.9,
  for example "RARRAY(ary)->ptr" to "RARRAY_PTR(ary)".
* internal.h: add some macros.
* RBASIC_CLEAR_CLASS(obj) clear RBasic::klass to make it internal
  object.
* RBASIC_SET_CLASS(obj, cls) set RBasic::klass.
* RBASIC_SET_CLASS_RAW(obj, cls) same as RBASIC_SET_CLASS
  without write barrier (planned).
* RCLASS_SET_SUPER(a, b) set super class of a.
* array.c, class.c, compile.c, encoding.c, enum.c, error.c, eval.c,
  file.c, gc.c, hash.c, io.c, iseq.c, marshal.c, object.c,
  parse.y, proc.c, process.c, random.c, ruby.c, sprintf.c,
  string.c, thread.c, transcode.c, vm.c, vm_eval.c, win32/file.c:
  Use above macros and functions to access RBasic::klass.
* ext/coverage/coverage.c, ext/readline/readline.c,
  ext/socket/ancdata.c, ext/socket/init.c,
* ext/zlib/zlib.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-13 10:49:11 +00:00
ko1 aacd771046 * *.c, parse.y, insns.def: use RARRAY_AREF/ASET macro
instead of using RARRAY_PTR().



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40690 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-13 09:56:22 +00:00
naruse 4834aa5307 * io.c (rb_io_ext_int_to_encs): ignore internal encoding if external
encoding is ASCII-8BIT. [Bug #8342]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-05-08 08:47:26 +00:00
kazu b22fa276e9 fix typo (r40195, r40428)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40486 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-26 16:13:56 +00:00
nobu 91fb5bc889 io.c: conversion from bom encoding
* io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is
  not a real encoding name, just a fallback.  so the proper conversion
  should take place even if if the internal encoding is equal to the
  bom-prefixed name, unless actual encoding is equal to the internal
  encoding.  [ruby-core:54563] [Bug #8323]
* io.c (io_set_encoding_by_bom): reset extenal encoding if no BOM
  found.  [ruby-core:54569]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40462 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-25 07:11:20 +00:00
kosaki 6edde68b5d * io.c (rb_fd_fix_cloexec): use rb_update_max_fd().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40438 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-24 05:15:56 +00:00
headius cd9e93d469 * Typo in defining EWOULDBLOCKWaitReadable on platforms where
EAGAIN != EWOULDBLOCK.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40428 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-23 20:29:24 +00:00
nobu 74ba9c2488 io.c: define EWOULDBLOCK
* io.c (Init_IO): define EWOULDBLOCK alway as it is needed always.
  and turn runtime branch into preprocessor condition.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40203 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-09 00:42:33 +00:00
headius 0626d9b91c Fix #6154 by introducing new EAGAIN/EWOULDBLOCK/EINPROGRESS
subclasses that include WaitReadable or WaitWritable rather than
extending them into the exception object each time.

* error.c: Capture EGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
  export them for use in WaitReadable/Writable exceptions.
* io.c: Create versions of EAGAIN, EWOULDBLOCK, EINPROGRESS that
  include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
  for nonblocking failures using those exceptions. Use that
  function in io_getpartial and io_write_nonblock instead of
  rb_mod_sys_fail
* ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
  WaitReadable and WaitWritable. Use those classes for
  write_would_block and read_would_block instead of rb_mod_sys_fail.
* ext/socket/ancdata.c: Use rb_readwrite_sys_fail instead of
  rb_mod_sys_fail in bsock_sendmsg_internal and
  bsock_recvmsg_internal.
* ext/socket/init.c: Use rb_readwrite_sys_fail instead of
  rb_mod_sys_fail in rsock_s_recvfrom_nonblock and
  rsock_s_connect_nonblock.
* ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
  rb_mod_sys_fail in sock_connect_nonblock.
* include/ruby/ruby.h: Export rb_readwrite_sys_fail for use instead
  of rb_mod_sys_fail. Introduce new constants RB_IO_WAIT_READABLE and
  RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40195 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-08 19:58:55 +00:00
akr b81ea661db * io.c (rb_io_seek_m): Accept :CUR, :END, :SET as "whence" argument.
(interpret_seek_whence): New function.
  [ruby-dev:45818] [Feature #6643]



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-03 12:25:09 +00:00
akr e89c029f2b update doc.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-04-02 09:48:34 +00:00
nobu 824cb69058 io.c: get rid of IOError when skipped while iteration
* io.c (argf_next_argv): set init flag if succeeded to forward, after
  skipping.
* io.c (argf_block_call_i, argf_block_call): no more forwarding if
  forwarded after skipping.  [ruby-list:49185]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39997 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-29 07:51:43 +00:00
nobu 8d7c52dbe2 io.c: get rid of IOError when skipped while iteration
* io.c (argf_close): deal with init flag.
* io.c (argf_block_call_i, argf_block_call): forward next file if
  skipped while iteration, to get rid of IOError.  [ruby-list:49185]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39996 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-29 07:51:08 +00:00
kosaki b945ad289f * io.c (linux_iocparm_len): enable only exist _IOC_SIZE().
Because musl libc doesn't have it. [Bug #8051] [ruby-core:53229]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-19 03:17:34 +00:00
naruse a9cbf64137 * io.c (io_fillbuf): show fd number on failure to debug.
http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20130316T050302Z.diff.html.gz

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39803 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-17 16:25:21 +00:00
nobu af24f5ff6a io.c: max_file_descriptor
* io.c (max_file_descriptor): rb_atomic_t for ATOMIC_CAS().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39776 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-16 07:28:20 +00:00
kosaki c824d47ebc * include/ruby/missing.h (__syscall): moved to...
* io.c: here. because __syscall() is only used from io.c.

* include/ruby/missing.h: move "#include <sys/type.h>" to ....
* include/ruby/intern.h: here. because it was introduced for
  fixing NFDBITS issue. [ruby-core:05179].

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39774 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-16 05:07:14 +00:00
nobu 0d3d9eff4d file.c: rb_sys_fail_path_with_func
* file.c (rb_sys_fail_path_with_func): share same function, and path
  may be nil.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39760 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-15 05:51:37 +00:00
naruse bfd52c985c * file.c (rb_sys_fail_path): define & use rb_sys_fail_path0 like r39752
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-14 23:25:09 +00:00
naruse 756cd2852d * io.c (extract_binmode): raise error even if binmode and textmode
don't conflict. [Bug #5918] [ruby-core:42199]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-11 08:02:36 +00:00
kosaki 235546ba04 * io.c (rb_update_max_fd): use ATOMIC_CAS because this function
is used from timer thread too.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39687 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-10 04:00:33 +00:00
marcandre b0c40fca24 * io.c: Fix rdoc typo [Github fixes #256]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39649 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-03-09 01:01:25 +00:00
nobu 391d691123 io.c: FOREACH_ARGF
* io.c (FOREACH_ARGF): loop for ARGF.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39220 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-02-13 08:51:27 +00:00
nobu dfd0cbece0 io.c: simplify
* io.c (rb_io_getline_fast, rb_io_each_{byte,codepoint}): simplify
  loops.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39219 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-02-13 08:51:25 +00:00
akr a00c92f7fc add doc. for IO#close_on_exec=.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39184 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-02-10 04:14:51 +00:00
nobu 330e39d568 io.c: no envp if no spawnve
* io.c (pipe_open): envp is not used if only spawnv is defined right
  now.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-15 14:07:17 +00:00
yugui c9f5a8f3f2 * bootstraptest/test_io.c: add a test for [ruby-dev:46834].
* io.c (rb_cloexec_fcntl_dupfd) Use an emulation with dup(2) when
  fcntl(2) and/or F_DUPFD is unavailable.
  Suggested by akr.

* configure.in (HAVE_FCNTL): NativeClient does not provide fcntl(2).

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-06 09:48:00 +00:00
kosaki 753f68cf20 * io.c (rb_cloexec_fcntl_dupfd): improve #ifdef condition.
* io.c (rb_maygvl_fd_fix_cloexec): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38699 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-04 23:23:40 +00:00
yugui 0626021e13 * io.c (rb_cloexec_fcntl_dupfd): Fix failures in
bootstrap_test/test_io.rb.  NativeClient does not support F_DUPFD
  but supports dup2(2).

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38683 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2013-01-03 15:39:10 +00:00
nobu be7bf5aa0c adjust style
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38654 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-29 12:22:04 +00:00
nobu 320b49473e error.c: rb_write_error_str
* error.c (compile_err_append, compile_warn_print, warn_print): use
  rb_write_error_str() instead of writing to rb_stderr directly.
* io.c (rb_write_error_str): a stopgap measure not to unblock GVL.
  warning from require seems to still have race condition errors.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38590 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-25 04:38:18 +00:00
knu c47c095b97 Deprecate #{lines,bytes,chars,codepoints} of IO-likes.
* io.c (rb_io_lines, rb_io_bytes, rb_io_chars, rb_io_codepoints):
  Deprecate IO#{lines,bytes,chars,codepoints} and those of ARGF.
  [Feature #6670]

* ext/stringio/stringio.c (strio_lines, strio_bytes, strio_chars)
  (strio_codepoints): Deprecate
  StringIO#{lines,bytes,chars,codepoints}. [Feature #6670]

* ext/zlib/zlib.c (rb_gzreader_lines, rb_gzreader_bytes):
  Deprecate Zlib::GzipReader#{lines,bytes}. [Feature #6670]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-22 17:22:04 +00:00
kosaki 398581564d * io.c (rb_io_wait_writable): use rb_thread_check_ints() instead
of rb_thread_fd_writable().
* io.c (rb_io_wait_readable): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-22 13:02:12 +00:00
kosaki 06dcf7840f * io.c (rb_io_wait_writable): don't use rb_thread_wait_fd()
because it is for waiting until io readable.

* io.c (rb_io_wait_writable): always use rb_thread_fd_writable()
  instaed of bare rb_wait_for_single_fd(). we shouldn't ignore
  return value.
* io.c (rb_io_wait_readable): ditto. always use rb_thread_wait_fd().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38448 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-18 10:07:15 +00:00
kosaki 6d8ad6c489 * io.c (io_flush_buffer_sync2): avoid to return 0. because
rb_thread_call_without_gvl2 uses 0 internally.
* io.c (io_flush_buffer_async2): adapt the above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38422 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-17 05:04:04 +00:00
kosaki 7fbaa0bedf * io.c (finish_writeconv): uses rb_write_internal2 if
fptr->write_lock have.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38401 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:40:29 +00:00
kosaki e78d4e69fe * thread.c (rb_mutex_owned_p): remove static.
* io.c (io_flush_buffer): don't hold mutex if already have.
  Now recursive lock may occur when following scenario.
  fptr_finalize -> finish_writeconv_sync -> finish_writeconv
  -> io_fflush.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:40:18 +00:00
kosaki 9bd33790b7 * io.c (io_flush_buffer): uses io_flush_buffer_async2 instead of
io_flush_buffer_async.
* io.c (io_flush_buffer_async2): new helper function for
  io_flush_buffer. It uses rb_thread_call_without_gvl2() instead
  of rb_thread_io_blocking_region.
* io.c (io_flush_buffer_sync2): new helper function for
  io_flush_buffer_async2.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:40:07 +00:00
kosaki 2a4d86f385 * io.c (internal_write_func2): new helper function for rb_write_internal2().
* io.c (rb_write_internal2): new function. it uses
  rb_thread_call_without_gvl2() instaed of rb_thread_io_blocking_region().
* io.c (rb_binwrite_string): uses rb_write_internal2 instead of
  rb_write_internal. [Bug #7134]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38398 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:39:57 +00:00
kosaki 96350867e1 * io.c (rb_io_wait_writable): add to call rb_thread_wait_fd()
likes rb_io_wait_readable.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38397 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:39:46 +00:00
kosaki 70df4dec03 * io.c (rb_io_wait_writable): don't call rb_thread_fd_writable()
when EINTR. EINTR mean signal interrupt was happen. We don't
  need any wait.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38396 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-15 05:39:36 +00:00
kosaki fe6b2e20e9 * thread.c (rb_uninterruptible): helper function for providing
temporary async_interrupt_timing(Object => :defer)

* io.c (rb_f_p): use rb_uninterruptible.
* io.c (rb_f_p_internal): helper function for rb_f_p().
* io.c (struct rb_f_p_arg): new struct for rb_f_p_internal.

* test/ruby/test_thread.rb (test_async_interrupt_and_p): test for
  the above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38225 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-05 19:37:49 +00:00
kosaki def63c3466 * io.c (io_binwrite): check interrupt before io issue.
* test/ruby/test_thread.rb (test_async_interrupt_and_io):
  test for the above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38224 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-05 19:37:37 +00:00
ko1 f6f388a5bd * array.c, enum.c, insns.def, io.c, numeric.c, parse.y, process.c,
range.c: use prepared IDs.
  A patch from charliesome (Charlie Somerville).
  [Bug #7495]
* common.mk: add dependency to id.h.
* common.mk: replace ID_H_INCLUDES with id.h.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38143 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-02 09:57:47 +00:00
nobu 01eb117b01 io.c: recurse for the argument
* io.c (rb_io_puts): recurse for the argument itself, not converted
  array elements.  [ruby-core:42444] [Bug #5986]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38120 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-12-01 10:24:12 +00:00
kosaki b8a1e36201 * thread.c (struct rb_mutex_struct): add allow_trap field.
* internal.h (rb_mutex_allow_trap): added.
* thread.c (rb_mutex_lock, rb_mutex_unlock): check mutex->allow_trap.
* thread.c (mutex_sleep): remove trap check because it uses
  rb_mutex_lock and rb_mutex_unlock internally.
* thread.c (rb_mutex_allow_trap): new helper function for the above.

* io.c (io_binwrite): mark fptr->write_lock as writable in trap.

* test/ruby/test_signal.rb (test_trap_puts): test for the above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37930 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-28 08:30:51 +00:00
kosaki e6ef313a49 * io.c (FMODE_SYNCWRITE): removed unused macro.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-28 06:36:28 +00:00
naruse 3e0becb42d * io.c (argf_each_codepoint): add missing ARGF#codepoints [Bug #7438]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37851 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-26 07:37:25 +00:00
kosaki c8a3b2ba8b * io.c (Init_IO): removed all rb_file_const() into file.c.
* file.c (Init_File): replace with rb_file_const() with
  rb_define_const() because RDoc don't care rb_file_const.
  [Bug #5530]



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-20 05:00:45 +00:00
zzak de794aefa6 * io.c (IO#new):
Fix indentation from r37444
  [ruby-core:48052] [Bug #7179]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37568 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-09 00:28:41 +00:00
zzak 4d42277823 * io.c (IO#new):
Documentation for IO#open modes and formatting
  [ruby-core#48052] [Bug #7179]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37443 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-11-03 04:27:56 +00:00
usa ee2718039c * process.c (redirect_dup2): set standard handles when new fd is stdio,
because if there is no allocated console at the moment Windows does
  not automatically associate it for child process's standard handle.
  this is adhoc workaround.
  reported by Martin Thiede at [ruby-core:48542] [Bug #7239].

* io.c (rb_cloexec_dup2): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-30 10:32:56 +00:00
nari c3a46d6aca * include/ruby/ruby.h: add C APIs.
VALUE rb_newobj_of(VALUE klass, VALUE flags)
  #define NEWOBJ_OF(obj,type,klass,flags)
  These allow to change a allocation strategy depending on klass
  or flags.

* gc.c: ditto

* array.c: use new C API.
* bignum.c: ditto
* class.c: ditto
* complex.c: ditto
* ext/socket/ancdata.c: ditto
* ext/socket/option.c: ditto
* hash.c: ditto
* io.c: ditto
* marshal.c: ditto
* numeric.c: ditto
* object.c: ditto
* random.c: ditto
* range.c: ditto
* rational.c: ditto
* re.c: ditto
* string.c: ditto
* struct.c: ditto
  [Feature #7177][Feature #7047]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-20 06:57:51 +00:00
nobu 5c677a83ba io.c: improved IO#reopen
* io.c (rb_io_reopen): improvement to accept optional arguments.
  a patch by Glass_saga (Masaki Matsushita) in [ruby-core:47806].
  [Feature #7103]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-10-03 02:43:19 +00:00
nobu 4a3c049cd1 io.c: IO#reopen int mode
* io.c (rb_io_reopen): accept File::Constants as well as mode string.
  based on the patch by Glass_saga (Masaki Matsushita) in
  [ruby-core:47694].  [Feature #7067]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-09-28 01:40:56 +00:00
nobu 59383b1f9c io.c: io_set_read_length
* io.c (io_set_read_length): if the read length equals to the buffer
  string size then nothing to do.  or ensure the string modifiable
  before setting the length only when the former is shorter.  based on
  the patch in [ruby-core:47541] by Hiroshi Shirosaki.
  [ruby-core:46586] [Bug #6764]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36980 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-09-16 02:39:18 +00:00
kosaki 84c77c1520 * ext/socket/basicsocket.c (rsock_bsock_send):
avoid unnecessary select() calls before doing I/O
  Patch by Eric Wong. [Feature #4538] [ruby-core:35586]
* ext/socket/init.c (rsock_s_recvfrom): ditto.
* ext/socket/init.c (rsock_s_accept): ditto.
* ext/socket/udpsocket.c (udp_send): ditto.
* io.c (io_fflush): ditto.
* io.c (io_binwrite): ditto.
* io.c (rb_io_syswrite): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36944 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-09-09 17:29:12 +00:00
kosaki 946f7fc788 * io.c (nogvl_close, maygvl_close, nogvl_fclose, maygvl_fclose):
suppress integer <-> pointer cast warnings.
  [Feature #4570] [ruby-core:35711]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-09-09 17:11:25 +00:00
kosaki 4c10b36467 * io.c (rb_io_close): notify fd close before releasing gvl.
* io.c (fptr_finalize): modify fptr->mode before releasing gvl.
  remove unnecessary rb_thread_fd_close().
  [Feature #4570] [ruby-core:35711]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2012-09-09 17:11:03 +00:00