/*
 * Inkscape::GC::Finalized - mixin for GC-managed objects with non-trivial
 *                           destructors
 *
 * Copyright 2006 MenTaLguY <mental@rydia.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * See the file COPYING for details.
 *
 */

#include <typeinfo>
#include "debug/simple-event.h"
#include "debug/event-tracker.h"
#include "util/format.h"
#include "util/share.h"
#include "gc-finalized.h"

namespace Inkscape {

namespace GC {

namespace {

// workaround for g++ 4.0.2
typedef Debug::SimpleEvent<Debug::Event::FINALIZERS> BaseEvent;

class FinalizerEvent : public BaseEvent {
public:
    FinalizerEvent(Finalized *object)
    : BaseEvent(Util::share_static_string("gc-finalizer"))
    {
        _addProperty("base", Util::format("%p", Core::base(object)));
        _addProperty("pointer", Util::format("%p", object));
        _addProperty("class", Util::share_static_string(typeid(*object).name()));
    }
};

}

void Finalized::_invoke_dtor(void *base, void *offset) {
    Finalized *object=_unoffset(base, offset);
    Debug::EventTracker<FinalizerEvent> tracker(object);
    object->~Finalized();
}

}

}

/*
  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 :
