X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketImpl.cci;h=e3c532eb00d4a6938b0dce7877c69f1ee5bb2946;hb=92f8630b75f3ef50e73c48cde58645dcd1534e27;hp=0197b24869440870aa2e677bd640f4503b71aa49;hpb=271789888cd1ae6361607616f9f4e6e460e192c4;p=senf.git diff --git a/Packets/PacketImpl.cci b/Packets/PacketImpl.cci index 0197b24..e3c532e 100644 --- a/Packets/PacketImpl.cci +++ b/Packets/PacketImpl.cci @@ -1,6 +1,8 @@ -// Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// $Id$ +// +// Copyright (C) 2007 +// 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 @@ -22,13 +24,29 @@ \brief PacketImpl inline non-template implementation */ // Custom includes -#include "PacketInterpreter.hh" +#include "../Utils/senfassert.hh" +// #include "PacketInterpreter.hh" #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// +// senf::detail::AnnotationIndexerBase + +prefix_ std::vector & senf::detail::AnnotationIndexerBase::small() +{ + static std::vector smalls; + return smalls; +} + +/////////////////////////////////////////////////////////////////////////// +// senf::detail::AnnotationP + +prefix_ senf::detail::AnnotationP::~AnnotationP() +{} + // Memory management: -// +// // * The PacketImpl destructor will *explicitly* clean-up the interpreters_ list by removing // each element from the list and deleting it if it's (intrusive) refcount is 0 // * The PacketInterpreters use safe hooks -> they know wether they are part of a list or not @@ -54,20 +72,13 @@ // senf::detail::PacketImpl prefix_ senf::detail::PacketImpl::PacketImpl() - : refcount_(0) + : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations) {} prefix_ senf::detail::PacketImpl::PacketImpl(size_type size, byte initValue) - : refcount_(0), data_(size,initValue) + : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations) {} -prefix_ senf::detail::PacketImpl::~PacketImpl() -{ - // We increment refcount_ to ensure, release() won't call delete again - ++refcount_; - eraseInterpreters(interpreters_.begin(), interpreters_.end()); -} - // rerference/memory management prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n) @@ -75,18 +86,6 @@ prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n) refcount_ += n; } -prefix_ void senf::detail::PacketImpl::release(refcount_t n) -{ - BOOST_ASSERT(refcount_ >= n); - // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide, - // however the destructor will remove all PacketInterpreters from the list and will thereby - // decrement refcount -> only decrenebt refcount_ when *not* caling delete - if (refcount_ == n) - delete this; - else - refcount_ -= n; -} - prefix_ senf::detail::PacketImpl::refcount_t senf::detail::PacketImpl::refcount() const { @@ -112,7 +111,7 @@ prefix_ senf::PacketInterpreterBase * senf::detail::PacketImpl::next(PacketInter } prefix_ senf::PacketInterpreterBase * senf::detail::PacketImpl::prev(PacketInterpreterBase * p) -{ +{ interpreter_list::iterator i (interpreter_list::current(*p)); return (i == interpreters_.begin()) ? 0 : &*(--i); } @@ -176,6 +175,33 @@ prefix_ void senf::detail::PacketImpl::erase(PacketData * self, iterator first, updateIterators(self,ix,-delta); } +prefix_ void senf::detail::PacketImpl::reserve(size_type n) +{ + data_.reserve(n); +} + +prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity() + const +{ + return data_.capacity(); +} + +// This function has a problem being inlined. Somehow, often when calling this, the size of the +// resulting inlined code would be huge? + +prefix_ void senf::detail::PacketImpl::release(refcount_t n) +{ + SENF_ASSERT(refcount_ >= n); + // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide, + // however the destructor will remove all PacketInterpreters from the list and will thereby + // decrement refcount -> only decrenebt refcount_ when *not* caling delete + if (refcount_ == n) + delete this; + else + refcount_ -= n; +} + + /////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl::Guard