raindrops RubyGem user+dev discussion/patches/pulls/bugs/help
 help / Atom feed
* [PATCH] TypedData C-API conversion
@ 2017-03-14 20:01 Eric Wong
  0 siblings, 0 replies; 1+ messages in thread
From: Eric Wong @ 2017-03-14 20:01 UTC (permalink / raw)
  To: raindrops-public

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


^ permalink raw reply	[flat|nested] 1+ messages in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-14 20:01 [PATCH] TypedData C-API conversion Eric Wong

raindrops RubyGem user+dev discussion/patches/pulls/bugs/help

Archives are clonable:
	git clone --mirror https://bogomips.org/raindrops-public
	git clone --mirror http://ou63pmih66umazou.onion/raindrops-public

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/
       or Tor2web: https://www.tor2web.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox