summaryrefslogtreecommitdiffstats
path: root/src/gc-anchored.cpp
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/gc-anchored.cpp
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/gc-anchored.cpp')
-rw-r--r--src/gc-anchored.cpp66
1 files changed, 66 insertions, 0 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;
+ }
+}
+
}
}