commit 00c12544492d40d98afd46e4995d1c45a850535e (patch)
parent fdda147 README: update regarding Ruby support status
tree 037f80313e76ac9704740998445587734b55ffe0
author Eric Wong <normalperson@yhbt.net> 2013-06-16 20:54:55 +0000
committer Eric Wong <normalperson@yhbt.net> 2013-06-16 20:54:55 +0000
linux_inet_diag: improve compatibility with newer GCs
RARRAY_PTR is expensive with GCs in Ruby 2.1.0dev and Rubinius, so
use rb_ary_entry for non-performance critical paths. Eventually,
RARRAY_AREF/RARRAY_ASET may be common, but for now, using
rb_ary_entry should require the least cognitive overhead for a
developer.
---
ext/raindrops/linux_inet_diag.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/ext/raindrops/linux_inet_diag.c b/ext/raindrops/linux_inet_diag.c
index dcf7bc2..cd4a876 100644
--- a/ext/raindrops/linux_inet_diag.c
+++ b/ext/raindrops/linux_inet_diag.c
@@ -586,8 +586,6 @@ static VALUE tcp_stats(struct nogvl_args *args, VALUE addr)
*/
static VALUE tcp_listener_stats(int argc, VALUE *argv, VALUE self)
{
- VALUE *ary;
- long i;
VALUE rv = rb_hash_new();
struct nogvl_args args;
VALUE addrs, sock;
@@ -610,20 +608,26 @@ static VALUE tcp_listener_stats(int argc, VALUE *argv, VALUE self)
case T_STRING:
rb_hash_aset(rv, addrs, tcp_stats(&args, addrs));
return rv;
- case T_ARRAY:
- ary = RARRAY_PTR(addrs);
- i = RARRAY_LEN(addrs);
- if (i == 1) {
- rb_hash_aset(rv, *ary, tcp_stats(&args, *ary));
+ case T_ARRAY: {
+ long i;
+ long len = RARRAY_LEN(addrs);
+ VALUE cur;
+
+ if (len == 1) {
+ cur = rb_ary_entry(addrs, 0);
+
+ rb_hash_aset(rv, cur, tcp_stats(&args, cur));
return rv;
}
- for (; --i >= 0; ary++) {
+ for (i = 0; i < len; i++) {
union any_addr check;
+ VALUE cur = rb_ary_entry(addrs, i);
- parse_addr(&check, *ary);
- rb_hash_aset(rv, *ary, Qtrue);
+ parse_addr(&check, cur);
+ rb_hash_aset(rv, cur, Qtrue);
}
/* fall through */
+ }
case T_NIL:
args.table = st_init_strtable();
gen_bytecode_all(&args.iov[2]);
glossary
--------
Commit objects reference one tree, and zero or more parents.
Single parent commits can typically generate a patch in
unified diff format via `git format-patch'.
Multiple parents means the commit is a merge.
Root commits have no ancestor. Note that it is
possible to have multiple root commits when merging independent histories.
Every commit references one top-level tree object.
git clone http://yhbt.net/raindrops.git