X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2Fintrusive_refcount.test.cc;h=212073b76fd09d4e5100622f2e7790b911f26fb5;hb=412024ed31a4ab4eaea7a4165a434f8efebee325;hp=ab547a9b70e2fb6d3c90119d90b00be493c86911;hpb=31d85cd6b8e03c5ecc924ca8892906be1bab702f;p=senf.git diff --git a/Utils/intrusive_refcount.test.cc b/Utils/intrusive_refcount.test.cc index ab547a9..212073b 100644 --- a/Utils/intrusive_refcount.test.cc +++ b/Utils/intrusive_refcount.test.cc @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ #include "intrusive_refcount.hh" #include -#include +#include "../Utils/auto_unit_test.hh" #include #define prefix_ @@ -48,6 +48,25 @@ namespace { }; unsigned Tester::counter = 0; + + struct TesterCustom + : public senf::intrusive_refcount_t + { + typedef boost::intrusive_ptr ptr; + typedef senf::intrusive_refcount_t super; + + TesterCustom() { ++counter; } + ~TesterCustom() { --counter; } + + void add_ref() { super::add_ref(); ++refs; } + bool release() { --refs; super::release(); return false; } + + static unsigned counter; + static unsigned refs; + }; + + unsigned TesterCustom::counter = 0; + unsigned TesterCustom::refs = 0; } BOOST_AUTO_UNIT_TEST(intrusive_refcount) @@ -74,6 +93,42 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) BOOST_CHECK_EQUAL(Tester::counter,0u); } +BOOST_AUTO_UNIT_TEST(intrusive_refcount_t) +{ + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + + TesterCustom::ptr p (new TesterCustom); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + + { + TesterCustom::ptr pp (p); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),2u); + BOOST_CHECK_EQUAL(p->is_shared(),true); + BOOST_CHECK_EQUAL(TesterCustom::refs,2u); + } + + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + { + TesterCustom * pp (p.get()); + p = 0; + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + // The TesterCustom leaks ... + delete pp; + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + } +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ @@ -85,4 +140,5 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) // indent-tabs-mode: nil // ispell-local-dictionary: "american" // compile-command: "scons -u test" +// comment-column: 40 // End: