summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a911b3f)
raw | patch | inline | side by side (parent: a911b3f)
author | mental <mental@users.sourceforge.net> | |
Sat, 29 Apr 2006 06:14:28 +0000 (06:14 +0000) | ||
committer | mental <mental@users.sourceforge.net> | |
Sat, 29 Apr 2006 06:14:28 +0000 (06:14 +0000) |
ChangeLog | patch | blob | history | |
src/gc-anchored.cpp | patch | blob | history | |
src/gc-anchored.h | patch | blob | history | |
src/util/Makefile_insert | patch | blob | history | |
src/util/format.h | [new file with mode: 0644] | patch | blob |
diff --git a/ChangeLog b/ChangeLog
index d49bec139d2857047df85a9cb7998fb7d007a316..bce69ca67a9ce963e752a60c0c09ae535ec0c3db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+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
diff --git a/src/gc-anchored.cpp b/src/gc-anchored.cpp
index 02dff76d435b60f56525fdd11b1460f1ce75b547..285efd69d909767ff742c376de960c31cdc375b9 100644 (file)
--- a/src/gc-anchored.cpp
+++ b/src/gc-anchored.cpp
* 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);
}
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 214f26a70531fc1f9c86d69bd46b29f248040b3b..917930a966ca6e0ccdf26c3b8d48914c5e30ef85 100644 (file)
--- a/src/gc-anchored.h
+++ b/src/gc-anchored.h
*
* Authors:
* MenTaLguY <mental@rydia.net>
- *
- * Copyright (C) 2004 MenTaLguY
+ * * Copyright (C) 2004 MenTaLguY
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
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)
--- a/src/util/Makefile_insert
+++ b/src/util/Makefile_insert
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
--- /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 :