diff --git a/src/gc-anchored.cpp b/src/gc-anchored.cpp
index baf36c0c95c51ffb4670565939b54c2620b36586..285efd69d909767ff742c376de960c31cdc375b9 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/simple-event.h"
+#include "debug/event.h"
#include "util/share.h"
#include "util/format.h"
namespace GC {
-namespace {
+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)
+ {}
-typedef Debug::SimpleEvent<Debug::Event::REFCOUNT> RefCountEvent;
+ static Category category() { return REFCOUNT; }
-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", Util::share_static_string(typeid(*object).name()));
- _addProperty("new-refcount", Util::format("%d", object->_anchored_refcount() + bias));
+ 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 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"))
- {}
+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);
}
}
void Anchored::anchor() const {
- Debug::EventTracker<AnchorEvent> tracker(this);
+ Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::ANCHOR);
if (!_anchor) {
_anchor = _new_anchor();
}
}
void Anchored::release() const {
- Debug::EventTracker<ReleaseEvent> tracker(this);
+ Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::RELEASE);
if (!--_anchor->refcount) {
_free_anchor(_anchor);
_anchor = NULL;