From: mental Date: Sat, 29 Apr 2006 06:14:28 +0000 (+0000) Subject: added refcount logging to GC::Anchored and shared string printf in util X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=cb492d6626459b2b9597ee37f9e7f7813f9b3b23;p=inkscape.git added refcount logging to GC::Anchored and shared string printf in util --- diff --git a/ChangeLog b/ChangeLog index d49bec139..bce69ca67 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-04-29 MenTaLguY + + * src/gc-anchored.cpp, src/gc-anchored.h: + + added refcount logging to GC::Anchored + + * src/util/Makefile_insert, src/util/format.h: + + shared string printf + 2006-04-28 MenTaLguY * src/sp-object.cpp: make refcount logging a little more useful diff --git a/src/gc-anchored.cpp b/src/gc-anchored.cpp index 02dff76d4..285efd69d 100644 --- a/src/gc-anchored.cpp +++ b/src/gc-anchored.cpp @@ -9,12 +9,62 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ +#include #include "gc-anchored.h" +#include "debug/event-tracker.h" +#include "debug/event.h" +#include "util/share.h" +#include "util/format.h" namespace Inkscape { namespace GC { +class AnchorEvent : public Debug::Event { +public: + enum Type { ANCHOR, RELEASE }; + + AnchorEvent(GC::Anchored const *object, Type type) + : _base(Util::format("%p", Core::base(const_cast(object)))), + _object(Util::format("%p", object)), + _class_name(Util::share_static_string(typeid(*object).name())), + _refcount(Util::format("%d", ( type == ANCHOR ? object->_anchored_refcount() + 1 : object->_anchored_refcount() - 1 ))), + _type(type) + {} + + static Category category() { return REFCOUNT; } + + Util::ptr_shared name() const { + if ( _type == ANCHOR ) { + return Util::share_static_string("gc-anchor"); + } else { + return Util::share_static_string("gc-release"); + } + } + unsigned propertyCount() const { return 4; } + PropertyPair property(unsigned index) const { + switch (index) { + case 0: + return PropertyPair("base", _base); + case 1: + return PropertyPair("pointer", _object); + case 2: + return PropertyPair("class", _class_name); + case 3: + return PropertyPair("new-refcount", _refcount); + default: + return PropertyPair(); + } + } + +private: + Util::ptr_shared _base; + Util::ptr_shared _object; + Util::ptr_shared _class_name; + Util::ptr_shared _refcount; + Type _type; +}; + Anchored::Anchor *Anchored::_new_anchor() const { return new Anchor(this); } @@ -23,6 +73,22 @@ void Anchored::_free_anchor(Anchored::Anchor *anchor) const { delete anchor; } +void Anchored::anchor() const { + Debug::EventTracker tracker(this, AnchorEvent::ANCHOR); + if (!_anchor) { + _anchor = _new_anchor(); + } + _anchor->refcount++; +} + +void Anchored::release() const { + Debug::EventTracker tracker(this, AnchorEvent::RELEASE); + if (!--_anchor->refcount) { + _free_anchor(_anchor); + _anchor = NULL; + } +} + } } diff --git a/src/gc-anchored.h b/src/gc-anchored.h index 214f26a70..917930a96 100644 --- a/src/gc-anchored.h +++ b/src/gc-anchored.h @@ -3,8 +3,7 @@ * * Authors: * MenTaLguY - * - * Copyright (C) 2004 MenTaLguY + * * Copyright (C) 2004 MenTaLguY * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -50,22 +49,17 @@ namespace GC { class Anchored { public: - void anchor() const { - if (!_anchor) { - _anchor = _new_anchor(); - } - _anchor->refcount++; - } + void anchor() const; + void release() const; - void release() const { - if (!--_anchor->refcount) { - _free_anchor(_anchor); - _anchor = NULL; - } + // for debugging + unsigned _anchored_refcount() const { + return ( _anchor ? _anchor->refcount : 0 ); } protected: Anchored() : _anchor(NULL) { anchor(); } // initial refcount of one + virtual ~Anchored() {} private: struct Anchor : public Managed { diff --git a/src/util/Makefile_insert b/src/util/Makefile_insert index bdd613385..e19e699a6 100644 --- a/src/util/Makefile_insert +++ b/src/util/Makefile_insert @@ -8,6 +8,7 @@ util_libinkutil_a_SOURCES = \ util/compose.hpp \ util/ucompose.hpp \ util/filter-list.h \ + util/format.h \ util/forward-pointer-iterator.h \ util/glib-list-iterators.h \ util/list.h \ diff --git a/src/util/format.h b/src/util/format.h new file mode 100644 index 000000000..1b8e9e2e2 --- /dev/null +++ b/src/util/format.h @@ -0,0 +1,54 @@ +/* + * Inkscape::Util::format - g_strdup_printf wrapper producing shared strings + * + * Authors: + * MenTaLguY + * + * Copyright (C) 2004 MenTaLguY + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef SEEN_INKSCAPE_UTIL_FORMAT_H +#define SEEN_INKSCAPE_UTIL_FORMAT_H + +#include +#include +#include "util/share.h" + +namespace Inkscape { + +namespace Util { + +inline ptr_shared vformat(char const *format, va_list args) { + char *temp=g_strdup_vprintf(format, args); + ptr_shared result=share_string(temp); + g_free(temp); + return result; +} + +inline ptr_shared format(char const *format, ...) { + va_list args; + + va_start(args, format); + ptr_shared result=vformat(format, args); + va_end(args); + + return result; +} + +} + +} + +#endif +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :