summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-03-18 08:16:31 +0000
committerEric Wong <e@80x24.org>2017-03-18 08:16:31 +0000
commitc374ed19128f87a52f024bd7a8e56e13f7423603 (patch)
tree64e278d4cb3a2c793eb4e36e6e2e4277625a0d18
parent958d445f48ceb1b6ded4f193d03681273734c860 (diff)
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
-rw-r--r--ext/posix_mq/posix_mq.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/ext/posix_mq/posix_mq.c b/ext/posix_mq/posix_mq.c
index 55ec51e..83e9e58 100644
--- a/ext/posix_mq/posix_mq.c
+++ b/ext/posix_mq/posix_mq.c
@@ -317,11 +317,22 @@ static void _free(void *ptr)
         xfree(ptr);
 }
 
+static size_t memsize(const void *ptr)
+{
+        return sizeof(struct posix_mq);
+}
+
+static const rb_data_type_t mqtype = {
+        "posix_mq",
+        { mark, _free, memsize, /* reserved */ },
+        /* parent, data, [ flags ] */
+};
+
 /* automatically called at creation (before initialize) */
 static VALUE alloc(VALUE klass)
 {
         struct posix_mq *mq;
-        VALUE rv = Data_Make_Struct(klass, struct posix_mq, mark, _free, mq);
+        VALUE rv = TypedData_Make_Struct(klass, struct posix_mq, &mqtype, mq);
 
         mq->des = MQD_INVALID;
         mq->autoclose = 1;
@@ -341,7 +352,7 @@ static struct posix_mq *get(VALUE self, int need_valid)
 {
         struct posix_mq *mq;
 
-        Data_Get_Struct(self, struct posix_mq, mq);
+        TypedData_Get_Struct(self, struct posix_mq, &mqtype, mq);
 
         if (need_valid && mq->des == MQD_INVALID)
                 rb_raise(rb_eIOError, "closed queue descriptor");