From c374ed19128f87a52f024bd7a8e56e13f7423603 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 18 Mar 2017 08:16:31 +0000 Subject: TypedData C-API conversion 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/posix_mq/posix_mq.c | 15 +++++++++++++-- 1 file 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"); -- cgit v1.2.3-24-ge0c7