From: Eric Wong <e@80x24.org> To: raindrops-public@bogomips.org Subject: [PATCH] TypedData C-API conversion Date: Tue, 14 Mar 2017 20:01:18 +0000 Message-ID: <20170314200118.31285-1-e@80x24.org> (raw) This provides some extra type safety if combined with other C extensions, as well as allowing us to account for memory usage of the HTTP parser in ObjectSpace. This requires Ruby 1.9.3+ and has remained a stable API since then. This will become officially supported when Ruby 2.3.0 is released later this month. This API has only been documented in doc/extension.rdoc (formerly README.EXT) in the Ruby source tree since April 2015, r50318 --- ext/raindrops/linux_tcp_info.c | 16 +++++++++++++--- ext/raindrops/raindrops.c | 19 ++++++++++++++++--- raindrops.gemspec | 1 + 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/ext/raindrops/linux_tcp_info.c b/ext/raindrops/linux_tcp_info.c index 4693e47..83001a5 100644 --- a/ext/raindrops/linux_tcp_info.c +++ b/ext/raindrops/linux_tcp_info.c @@ -46,12 +46,22 @@ TCPI_ATTR_READER(rcv_rtt) TCPI_ATTR_READER(rcv_space) TCPI_ATTR_READER(total_retrans) +static size_t tcpi_memsize(const void *ptr) +{ + return sizeof(struct tcp_info); +} + +static const rb_data_type_t tcpi_type = { + "tcp_info", + { NULL, RUBY_TYPED_DEFAULT_FREE, tcpi_memsize, /* reserved */ }, + /* parent, data, [ flags ] */ +}; + static VALUE alloc(VALUE klass) { - struct tcp_info *info = xmalloc(sizeof(struct tcp_info)); + struct tcp_info *info; - /* Data_Make_Struct has an extra memset 0 which is so wasteful */ - return Data_Wrap_Struct(klass, NULL, -1, info); + return TypedData_Make_Struct(klass, struct tcp_info, &tcpi_type, info); } /* diff --git a/ext/raindrops/raindrops.c b/ext/raindrops/raindrops.c index 65c16e7..390b8b8 100644 --- a/ext/raindrops/raindrops.c +++ b/ext/raindrops/raindrops.c @@ -38,7 +38,7 @@ struct raindrops { }; /* called by GC */ -static void gcfree(void *ptr) +static void rd_free(void *ptr) { struct raindrops *r = ptr; @@ -51,11 +51,24 @@ static void gcfree(void *ptr) xfree(ptr); } +static size_t rd_memsize(const void *ptr) +{ + const struct raindrops *r = ptr; + + return r->drops == MAP_FAILED ? 0 : raindrop_size * r->capa; +} + +static const rb_data_type_t rd_type = { + "raindrops", + { NULL, rd_free, rd_memsize, /* reserved */ }, + /* parent, data, [ flags ] */ +}; + /* automatically called at creation (before initialize) */ static VALUE alloc(VALUE klass) { struct raindrops *r; - VALUE rv = Data_Make_Struct(klass, struct raindrops, NULL, gcfree, r); + VALUE rv = TypedData_Make_Struct(klass, struct raindrops, &rd_type, r); r->drops = MAP_FAILED; return rv; @@ -65,7 +78,7 @@ static struct raindrops *get(VALUE self) { struct raindrops *r; - Data_Get_Struct(self, struct raindrops, r); + TypedData_Get_Struct(self, struct raindrops, &rd_type, r); if (r->drops == MAP_FAILED) rb_raise(rb_eStandardError, "invalid or freed Raindrops"); diff --git a/raindrops.gemspec b/raindrops.gemspec index 356bff2..c00a6b5 100644 --- a/raindrops.gemspec +++ b/raindrops.gemspec @@ -18,6 +18,7 @@ s.files = manifest s.homepage = Olddoc.config['rdoc_url'] s.summary = summary + s.required_ruby_version = '>= 1.9.3' s.test_files = test_files s.add_development_dependency('aggregate', '~> 0.2') s.add_development_dependency('test-unit', '~> 3.0') -- EW
reply other threads:[~2017-03-14 20:01 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: https://yhbt.net/raindrops/ * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170314200118.31285-1-e@80x24.org \ --to=e@80x24.org \ --cc=raindrops-public@bogomips.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
raindrops RubyGem user+dev discussion/patches/pulls/bugs/help This inbox may be cloned and mirrored by anyone: git clone --mirror https://yhbt.net/raindrops-public git clone --mirror http://ou63pmih66umazou.onion/raindrops-public # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V1 raindrops-public raindrops-public/ https://yhbt.net/raindrops-public \ raindrops-public@yhbt.net raindrops-public@bogomips.org raindrops@librelist.org raindrops@librelist.com public-inbox-index raindrops-public Example config snippet for mirrors. Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.lang.ruby.raindrops nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.raindrops note: .onion URLs require Tor: https://www.torproject.org/ code repositories for the project(s) associated with this inbox: ../../raindrops.git AGPL code for this site: git clone http://ou63pmih66umazou.onion/public-inbox.git