Code

Applied patch #1505715
[inkscape.git] / src / libnr / nr-object.cpp
index b18685d11f5d405d4f1290d6d742fb68d962bc8f..12f57bd81f81deeecb40ee1a4c3643095b13f712 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
+#include <typeinfo>
+
+#include <glib/gmem.h>
 #include <libnr/nr-macros.h>
 
 #include "nr-object.h"
+#include "debug/event-tracker.h"
+#include "debug/simple-event.h"
+#include "util/share.h"
+#include "util/format.h"
 
 unsigned int nr_emit_fail_warning(const gchar *file, unsigned int line, const gchar *method, const gchar *expr)
 {
@@ -71,7 +78,7 @@ NRType nr_object_register_type(NRType parent,
 {
     if (classes_len >= classes_size) {
        classes_size += 32;
-       classes = nr_renew (classes, NRObjectClass *, classes_size);
+       classes = g_renew (NRObjectClass *, classes, classes_size);
        if (classes_len == 0) {
            classes[0] = NULL;
            classes_len = 1;
@@ -150,9 +157,25 @@ static void nr_class_tree_object_invoke_init(NRObjectClass *c, NRObject *object)
 
 namespace {
 
+namespace Debug = Inkscape::Debug;
+namespace Util = Inkscape::Util;
+
+typedef Debug::SimpleEvent<Debug::Event::FINALIZERS> BaseFinalizerEvent;
+
+class FinalizerEvent : public BaseFinalizerEvent {
+public:
+    FinalizerEvent(NRObject *object)
+    : BaseFinalizerEvent(Util::share_static_string("nr-object-finalizer"))
+    {
+        _addProperty("object", Util::format("%p", object));
+        _addProperty("class", Util::share_static_string(typeid(*object).name()));
+    }
+};
+
 void finalize_object(void *base, void *)
 {
     NRObject *object = reinterpret_cast<NRObject *>(base);
+    Debug::EventTracker<FinalizerEvent> tracker(object);
     object->klass->finalize(object);
     object->~NRObject();
 }
@@ -229,7 +252,7 @@ static void nr_active_object_finalize(NRObject *object)
                listener->vector->dispose(object, listener->data);
            }
        }
-       free (aobject->callbacks);
+       g_free (aobject->callbacks);
     }
 
     ((NRObjectClass *) (parent_class))->finalize(object);
@@ -241,7 +264,7 @@ void nr_active_object_add_listener(NRActiveObject *object,
                                   void *data)
 {
     if (!object->callbacks) {
-       object->callbacks = (NRObjectCallbackBlock*) malloc(sizeof(NRObjectCallbackBlock));
+       object->callbacks = (NRObjectCallbackBlock*)g_malloc(sizeof(NRObjectCallbackBlock));
        object->callbacks->size = 1;
        object->callbacks->length = 0;
     }
@@ -249,7 +272,7 @@ void nr_active_object_add_listener(NRActiveObject *object,
     if (object->callbacks->length >= object->callbacks->size) {
        int newsize = object->callbacks->size << 1;
        object->callbacks = (NRObjectCallbackBlock *)
-           realloc(object->callbacks, sizeof(NRObjectCallbackBlock) + (newsize - 1) * sizeof (NRObjectListener));
+           g_realloc(object->callbacks, sizeof(NRObjectCallbackBlock) + (newsize - 1) * sizeof (NRObjectListener));
        object->callbacks->size = newsize;
     }
     
@@ -271,7 +294,7 @@ void nr_active_object_remove_listener_by_data(NRActiveObject *object, void *data
        if ( listener->data == data ) {
            object->callbacks->length -= 1;
            if ( object->callbacks->length < 1 ) {
-               free(object->callbacks);
+               g_free(object->callbacks);
                object->callbacks = NULL;
            } else if ( object->callbacks->length != i ) {
                *listener = object->callbacks->listeners[object->callbacks->length];