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 [thread overview]
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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/raindrops.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).