Code

added refcount logging to GC::Anchored and shared string printf in util
authormental <mental@users.sourceforge.net>
Sat, 29 Apr 2006 06:14:28 +0000 (06:14 +0000)
committermental <mental@users.sourceforge.net>
Sat, 29 Apr 2006 06:14:28 +0000 (06:14 +0000)
ChangeLog
src/gc-anchored.cpp
src/gc-anchored.h
src/util/Makefile_insert
src/util/format.h [new file with mode: 0644]

index d49bec139d2857047df85a9cb7998fb7d007a316..bce69ca67a9ce963e752a60c0c09ae535ec0c3db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-04-29  MenTaLguY  <mental@rydia.net>
+
+       * 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  <mental@rydia.net>
 
     * src/sp-object.cpp: make refcount logging a little more useful
index 02dff76d435b60f56525fdd11b1460f1ce75b547..285efd69d909767ff742c376de960c31cdc375b9 100644 (file)
@@ -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;
+    }
+}
+
 }
 
 }
index 214f26a70531fc1f9c86d69bd46b29f248040b3b..917930a966ca6e0ccdf26c3b8d48914c5e30ef85 100644 (file)
@@ -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> {
index bdd613385401dc9aad51dd772dd309401b2f6e26..e19e699a6dd423d29182074bcaf211ec4b26ab78 100644 (file)
@@ -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 (file)
index 0000000..1b8e9e2
--- /dev/null
@@ -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 :