X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cc;h=0c38d466f7680721ee070da61e4b34573f2603da;hb=14f43d9587103f6a78e51628785f93f1c14f99a0;hp=f9c598f8de604be939e66a61799768e88bf56d08;hpb=73a2b9252afa039e5e8d0cace3f658478b696483;p=senf.git diff --git a/senf/Packets/PacketImpl.cc b/senf/Packets/PacketImpl.cc index f9c598f..0c38d46 100644 --- a/senf/Packets/PacketImpl.cc +++ b/senf/Packets/PacketImpl.cc @@ -47,6 +47,19 @@ prefix_ senf::detail::PacketImpl::~PacketImpl() eraseInterpreters(interpreters_.begin(), interpreters_.end()); } +prefix_ void senf::detail::PacketImpl::release() +{ + SENF_ASSERT(refcount_ >= 1, "Internal failure: Releasing dead PacketImpl ??"); + // uah ... we need to be extremely careful here. If refcount_ is 1, we want to commit suicide, + // however the destructor will remove all PacketInterpreters from the list and will thereby + // decrement refcount -> only decrement refcount_ when *not* calling delete (otherwise + // the assert above will fail) + if (refcount_ == 1) + delete this; + else + -- refcount_; +} + // interpreter chain prefix_ void senf::detail::PacketImpl::appendInterpreter(PacketInterpreterBase * p) @@ -154,6 +167,18 @@ prefix_ void * senf::detail::PacketImpl::complexAnnotation(AnnotationRegistry::k /////////////////////////////////////////////////////////////////////////// // senf::detail::AnnotationRegistry +prefix_ void senf::detail::AnnotationRegistry::dump(key_type key, std::ostream & os, + void * annotation) + const +{ + Registry::const_iterator i (registry_.find(key)); + if (i != registry_.end()) { + os << fieldName(i->second->v_name()); + i->second->v_dump(os, annotation); + os << "\n"; + } +} + prefix_ void senf::detail::AnnotationRegistry::dumpRegistrations(std::ostream & os) { boost::format fmt ("%-56.56s %-4.4s %-7.7s %5d\n");