diff --git a/src/gc-anchored.cpp b/src/gc-anchored.cpp
index 285efd69d909767ff742c376de960c31cdc375b9..91055c968259493cd9ca562c6b9207bf07308b51 100644 (file)
--- a/src/gc-anchored.cpp
+++ b/src/gc-anchored.cpp
#include <typeinfo>
#include "gc-anchored.h"
#include "debug/event-tracker.h"
-#include "debug/event.h"
+#include "debug/simple-event.h"
+#include "debug/demangle.h"
#include "util/share.h"
#include "util/format.h"
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)
- {}
+namespace {
- static Category category() { return REFCOUNT; }
+typedef Debug::SimpleEvent<Debug::Event::REFCOUNT> RefCountEvent;
- 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();
- }
+class BaseAnchorEvent : public RefCountEvent {
+public:
+ BaseAnchorEvent(Anchored const *object, int bias,
+ Util::ptr_shared<char> name)
+ : RefCountEvent(name)
+ {
+ _addProperty("base", Util::format("%p", Core::base(const_cast<Anchored *>(object))));
+ _addProperty("pointer", Util::format("%p", object));
+ _addProperty("class", Debug::demangle(typeid(*object).name()));
+ _addProperty("new-refcount", Util::format("%d", object->_anchored_refcount() + bias));
}
+};
-private:
- Util::ptr_shared<char> _base;
- Util::ptr_shared<char> _object;
- Util::ptr_shared<char> _class_name;
- Util::ptr_shared<char> _refcount;
- Type _type;
+class AnchorEvent : public BaseAnchorEvent {
+public:
+ AnchorEvent(Anchored const *object)
+ : BaseAnchorEvent(object, 1, Util::share_static_string("gc-anchor"))
+ {}
};
+class ReleaseEvent : public BaseAnchorEvent {
+public:
+ ReleaseEvent(Anchored const *object)
+ : BaseAnchorEvent(object, -1, Util::share_static_string("gc-release"))
+ {}
+};
+
+}
+
Anchored::Anchor *Anchored::_new_anchor() const {
return new Anchor(this);
}
}
void Anchored::anchor() const {
- Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::ANCHOR);
+ Debug::EventTracker<AnchorEvent> tracker(this);
if (!_anchor) {
_anchor = _new_anchor();
}
}
void Anchored::release() const {
- Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::RELEASE);
+ Debug::EventTracker<ReleaseEvent> tracker(this);
+ g_return_if_fail(_anchor);
if (!--_anchor->refcount) {
_free_anchor(_anchor);
_anchor = NULL;