From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS6939 64.71.128.0/18 X-Spam-Status: No, score=-1.7 required=3.0 tests=AWL,BAYES_00,FREEMAIL_FROM, MSGID_FROM_MTA_HEADER shortcircuit=no autolearn=unavailable version=3.3.2 Path: news.gmane.org!not-for-mail From: Sokolov Yura 'funny-falcon Newsgroups: gmane.comp.lang.ruby.kgio.general Subject: [PATCH 2/3] use rb_str_subseq for tail string on write Date: Wed, 30 May 2012 17:56:55 +0400 Message-ID: <1338386216-14568-2-git-send-email-funny.falcon@gmail.com> References: <1338386216-14568-1-git-send-email-funny.falcon@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1338386242 13631 80.91.229.3 (30 May 2012 13:57:22 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 30 May 2012 13:57:22 +0000 (UTC) To: kgio@librelist.com Original-X-From: kgio@librelist.com Wed May 30 15:57:21 2012 Return-path: Envelope-to: gclrkg-kgio@m.gmane.org List-Archive: List-Help: List-Id: List-Post: List-Subscribe: List-Unsubscribe: Precedence: list Original-Sender: kgio@librelist.com Xref: news.gmane.org gmane.comp.lang.ruby.kgio.general:156 Archived-At: Received: from zedshaw.xen.prgmr.com ([64.71.167.205]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1SZjOq-0007I5-CC for gclrkg-kgio@m.gmane.org; Wed, 30 May 2012 15:57:20 +0200 Received: from zedshaw.xen.prgmr.com (localhost [IPv6:::1]) by zedshaw.xen.prgmr.com (Postfix) with ESMTP id 59EE221DD05 for ; Wed, 30 May 2012 14:05:10 +0000 (UTC) Use rb_str_subseq for taking string's tail. rb_str_subseq do not allocate additional memory in this case. And although it prevents from collecting original string, it seems that tests wins both in performance and in memory usage. Use fallback to rb_str_substr on ruby1.8 --- ext/kgio/extconf.rb | 1 + ext/kgio/read_write.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/kgio/extconf.rb b/ext/kgio/extconf.rb index fb680f7..f6bd0cc 100644 --- a/ext/kgio/extconf.rb +++ b/ext/kgio/extconf.rb @@ -49,5 +49,6 @@ have_func('rb_thread_io_blocking_region') have_func('rb_str_set_len') have_func('rb_time_interval') have_func('rb_wait_for_single_fd') +have_func('rb_str_subseq') create_makefile('kgio_ext') diff --git a/ext/kgio/read_write.c b/ext/kgio/read_write.c index 51d2d16..9924743 100644 --- a/ext/kgio/read_write.c +++ b/ext/kgio/read_write.c @@ -4,6 +4,9 @@ static VALUE sym_wait_readable, sym_wait_writable; static VALUE eErrno_EPIPE, eErrno_ECONNRESET; static ID id_set_backtrace; +#ifndef HAVE_RB_STR_SUBSEQ +#define rb_str_subseq rb_str_substr +#endif /* * we know MSG_DONTWAIT works properly on all stream sockets under Linux @@ -338,7 +341,7 @@ done: a->ptr = RSTRING_PTR(a->buf) + written; return -1; } else if (written > 0) { - a->buf = rb_str_new(a->ptr, a->len); + a->buf = rb_str_subseq(a->buf, written, a->len); } else { a->buf = sym_wait_writable; } -- 1.7.9.5