summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-04-29 06:14:28 +0000
committermental <mental@users.sourceforge.net>2006-04-29 06:14:28 +0000
commit196536980f7b66ffa3363c9c2b736f7ef00f11b4 (patch)
tree69d43969e66873ee837c2de5cde6dcb43a4df4f9 /src
parentadd new object style display for all object-creating tools (diff)
downloadinkscape-196536980f7b66ffa3363c9c2b736f7ef00f11b4.tar.gz
inkscape-196536980f7b66ffa3363c9c2b736f7ef00f11b4.zip
added refcount logging to GC::Anchored and shared string printf in util
(bzr r614)
Diffstat (limited to 'src')
-rw-r--r--src/gc-anchored.cpp66
-rw-r--r--src/gc-anchored.h20
-rw-r--r--src/util/Makefile_insert1
-rw-r--r--src/util/format.h54
4 files changed, 128 insertions, 13 deletions
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 <typeinfo>
#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<Anchored *>(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<char> 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<char> _base;
+ Util::ptr_shared<char> _object;
+ Util::ptr_shared<char> _class_name;
+ Util::ptr_shared<char> _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<AnchorEvent> tracker(this, AnchorEvent::ANCHOR);
+ if (!_anchor) {
+ _anchor = _new_anchor();
+ }
+ _anchor->refcount++;
+}
+
+void Anchored::release() const {
+ Debug::EventTracker<AnchorEvent> 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 <mental@rydia.net>
- *
- * 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<SCANNED, MANUAL> {
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 <mental@rydia.net>
+ *
+ * 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 <stdarg.h>
+#include <glib/gstrfuncs.h>
+#include "util/share.h"
+
+namespace Inkscape {
+
+namespace Util {
+
+inline ptr_shared<char> vformat(char const *format, va_list args) {
+ char *temp=g_strdup_vprintf(format, args);
+ ptr_shared<char> result=share_string(temp);
+ g_free(temp);
+ return result;
+}
+
+inline ptr_shared<char> format(char const *format, ...) {
+ va_list args;
+
+ va_start(args, format);
+ ptr_shared<char> 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 :