Made the IO buffer global.
authorTilman Sauerbeck <tilman@code-monkey.de>
Fri, 11 Aug 2006 13:40:05 +0000 (15:40 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Wed, 23 Aug 2006 17:33:24 +0000 (19:33 +0200)
There's no need to give each Ogg::Vorbis::Tagger instance its own
buffer. This should help memory consumption when there's more than
one Ogg::Vorbis::Tagger object around. The downside is that the buffer
object will be kept alive forever.

ext/ext.c

index 4794d282dca70b4a66d20321a1eb24e9a7be2c45..99eefbe9ba5ef6ff6684e45c97a7aea6b5c5790e 100644 (file)
--- a/ext/ext.c
+++ b/ext/ext.c
@@ -29,12 +29,11 @@ typedef struct {
        vcedit_state *state;
 
        VALUE comments;
-       VALUE io_buf;
 } RbVorbisTagger;
 
 static VALUE c_close (VALUE self);
 
-static VALUE cComments, eVTError;
+static VALUE cComments, eVTError, io_buf;
 static ID id_read, id_write, id_seek, id_length;
 
 static size_t
@@ -44,9 +43,9 @@ on_read (void *ptr, size_t size, size_t nmemb, RbVorbisTagger *o)
        size_t total = size * nmemb;
        VALUE tmp;
 
-       rb_str_resize (o->io_buf, size * nmemb);
+       rb_str_resize (io_buf, size * nmemb);
 
-       tmp = rb_funcall (o->io, id_read, 2, LONG2NUM (total), o->io_buf);
+       tmp = rb_funcall (o->io, id_read, 2, LONG2NUM (total), io_buf);
        if (NIL_P (tmp))
                return 0;
 
@@ -61,10 +60,10 @@ on_write (const void *ptr, size_t size, size_t nmemb, RbVorbisTagger *o)
 {
        size_t total = size * nmemb;
 
-       rb_str_resize (o->io_buf, total);
-       memcpy (RSTRING (o->io_buf)->ptr, ptr, total);
+       rb_str_resize (io_buf, total);
+       memcpy (RSTRING (io_buf)->ptr, ptr, total);
 
-       return NUM2LONG (rb_io_write (o->io, o->io_buf));
+       return NUM2LONG (rb_io_write (o->io, io_buf));
 }
 
 static void
@@ -72,7 +71,7 @@ c_mark (RbVorbisTagger *o)
 {
        rb_gc_mark (o->io);
        rb_gc_mark (o->comments);
-       rb_gc_mark (o->io_buf);
+       rb_gc_mark (io_buf);
 }
 
 static void
@@ -146,7 +145,6 @@ c_init (VALUE self, VALUE io)
                rb_raise (rb_eArgError, "invalid argument");
 
        o->io = io;
-       o->io_buf = rb_str_buf_new (BUFSIZ);
 
        o->state = vcedit_state_new ();
        if (!o->state)
@@ -278,4 +276,7 @@ Init_vorbistagger_ext (void)
        id_length = rb_intern ("length");
 
        cComments = Init_Comments (mVorbis);
+
+       io_buf = rb_str_buf_new (BUFSIZ);
+       rb_global_variable (&io_buf);
 }