From a02e3ce3dd4509932de30613cfcecb07e397f55f Mon Sep 17 00:00:00 2001 From: "Erik S. Chang" Date: Thu, 15 Apr 2010 00:15:51 +0000 Subject: [PATCH] make emitter #dup and #clone GC-safe git-svn-id: https://lwes.svn.sourceforge.net/svnroot/lwes/lwes-ruby/trunk@428 a2f82657-cdd2-4550-bd36-68a8e7111808 --- ext/lwes/emitter.c | 16 ++++++++++++++++ test/unit/test_emitter.rb | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/ext/lwes/emitter.c b/ext/lwes/emitter.c index 04f3f17..74eccab 100644 --- a/ext/lwes/emitter.c +++ b/ext/lwes/emitter.c @@ -381,6 +381,21 @@ retry: } } +/* :nodoc: */ +static VALUE init_copy(VALUE dest, VALUE obj) +{ + struct _rb_lwes_emitter *dst = _rle(dest); + struct _rb_lwes_emitter *src = _rle(obj); + + memcpy(dst, src, sizeof(*dst)); + lwesrb_emitter_create(dst); + + assert(dst->emitter && dst->emitter != src->emitter && + "emitter not a copy"); + + return dest; +} + /* should only used internally by #initialize */ static VALUE _create(VALUE self, VALUE options) { @@ -454,6 +469,7 @@ void lwesrb_init_emitter(void) rb_define_method(cLWES_Emitter, "emit", emitter_emit, -1); rb_define_method(cLWES_Emitter, "_create", _create, 1); rb_define_method(cLWES_Emitter, "close", emitter_close, 0); + rb_define_method(cLWES_Emitter, "initialize_copy", init_copy, 1); rb_define_alloc_func(cLWES_Emitter, rle_alloc); LWESRB_MKID(TYPE_DB); LWESRB_MKID(TYPE_LIST); diff --git a/test/unit/test_emitter.rb b/test/unit/test_emitter.rb index 4738d1f..833ed69 100644 --- a/test/unit/test_emitter.rb +++ b/test/unit/test_emitter.rb @@ -20,6 +20,20 @@ class TestEmitter < Test::Unit::TestCase assert_instance_of LWES::Emitter, LWES::Emitter.new(@options) end + def test_dup + orig = LWES::Emitter.new(@options) + duped = orig.dup + assert_instance_of LWES::Emitter, duped + assert duped.object_id != orig.object_id + end + + def test_clone + orig = LWES::Emitter.new(@options) + cloned = orig.clone + assert_instance_of LWES::Emitter, cloned + assert cloned.object_id != orig.object_id + end + def test_initialize_with_heartbeat heartbeat = @options.merge(:heartbeat => 30) assert_instance_of LWES::Emitter, LWES::Emitter.new(heartbeat) -- 2.11.4.GIT