X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cci;h=63c330c0a977d72248395f5f3f2c58be278c2891;hb=961cf85a6abf2b5f0a7958bbfcd8f72e7b32721b;hp=d7a2ec3a64d93132111e1563e3297c2d3864ff3a;hpb=9cb871b939efe93e35dd96808d25089399acfc46;p=senf.git diff --git a/senf/Packets/PacketImpl.cci b/senf/Packets/PacketImpl.cci index d7a2ec3..63c330c 100644 --- a/senf/Packets/PacketImpl.cci +++ b/senf/Packets/PacketImpl.cci @@ -31,40 +31,71 @@ ///////////////////////////////cci.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationIndexerBase +// senf::detail::AnnotationRegistry -prefix_ senf::detail::AnnotationIndexerBase::~AnnotationIndexerBase() -{} +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_ std::vector & senf::detail::AnnotationIndexerBase::small() +prefix_ std::string senf::detail::AnnotationRegistry::name(key_type key) + const { - static std::vector smalls; - return smalls; + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? "" : i->second->v_name(); } -prefix_ std::vector & -senf::detail::AnnotationIndexerBase::registry() +prefix_ bool senf::detail::AnnotationRegistry::isComplex(key_type key) + const { - static std::vector reg; - return reg; + Registry::const_iterator i (registry_.find(key)); + return i != registry_.end() && i->second->v_isComplex(); } -/////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationP +prefix_ unsigned senf::detail::AnnotationRegistry::size(key_type key) + const +{ + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? 0 : i->second->v_size(); +} + +prefix_ senf::detail::AnnotationRegistry::iterator senf::detail::AnnotationRegistry::begin() + const +{ + return boost::make_transform_iterator(index_.begin(), + __gnu_cxx::select2nd()); +} + +prefix_ senf::detail::AnnotationRegistry::iterator senf::detail::AnnotationRegistry::end() + const +{ + return boost::make_transform_iterator(index_.end(), + __gnu_cxx::select2nd()); +} -prefix_ senf::detail::AnnotationP::~AnnotationP() +prefix_ senf::detail::AnnotationRegistry::AnnotationRegistry() + : simpleAnnotationCount_ (0), complexAnnotationCount_ (0) {} +/////////////////////////////////////////////////////////////////////////// + // 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 +// * The PacketInterpreters use safe hooks -> they know whether they are part of a list or not // * PacketHandle has an intrusive_ptr to PacketInterpreterBase. The intrusive_ptr_add_ref // will refcount both the PacketImpl as well as the PacketInterpreterBase // * intrusive_ptr_remove will only delete the object if it's not in a container // * removing an object from the list will decrement the PacketImpl refcount accordingly -// * inserting an object into the list will incroment the PacketImpl refcount accordingly +// * inserting an object into the list will increment the PacketImpl refcount accordingly // * each PacketInterpreterBase instance holds a *raw* pointer to the PacketImpl // // The following operations change refcounts: @@ -82,14 +113,18 @@ prefix_ senf::detail::AnnotationP::~AnnotationP() // senf::detail::PacketImpl prefix_ senf::detail::PacketImpl::PacketImpl() - : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations) -{} + : refcount_(0) +{ + ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_)); +} prefix_ senf::detail::PacketImpl::PacketImpl(size_type size, byte initValue) - : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations) -{} + : refcount_(0), data_(size,initValue) +{ + ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_)); +} -// rerference/memory management +// reference/memory management prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n) { @@ -196,26 +231,27 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity() return data_.capacity(); } -prefix_ void senf::detail::PacketImpl::dumpAnnotations(std::ostream & os) -{ - AnnotationIndexerBase::dump(this, os); -} - // 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); + SENF_ASSERT(refcount_ >= n, "Internal failure: Releasing dead PacketImpl ??"); // 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 + // decrement refcount -> only decrement refcount_ when *not* calling delete if (refcount_ == n) delete this; else refcount_ -= n; } +// Annotations + +prefix_ void * senf::detail::PacketImpl::annotation(AnnotationRegistry::key_type key) +{ + return key >= 0 ? & simpleAnnotations_[key] : complexAnnotation(key); +} /////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl::Guard