diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/Makefile_insert | 1 | ||||
| -rw-r--r-- | src/knot-ptr.cpp | 25 | ||||
| -rw-r--r-- | src/knot-ptr.h | 8 | ||||
| -rw-r--r-- | src/knot.cpp | 3 | ||||
| -rw-r--r-- | src/ui/tools/tool-base.cpp | 2 |
6 files changed, 41 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4a792af6b..94b4b8c85 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -218,6 +218,7 @@ set(inkscape_SRC knot-holder-entity.cpp knot.cpp knotholder.cpp + knot-ptr.cpp layer-fns.cpp layer-manager.cpp layer-model.cpp @@ -356,6 +357,7 @@ set(inkscape_SRC knot-holder-entity.h knot.h knotholder.h + knot-ptr.h layer-fns.h layer-manager.h layer-model.h diff --git a/src/Makefile_insert b/src/Makefile_insert index f191839a1..436ab26f9 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -80,6 +80,7 @@ ink_common_sources += \ knot-enums.h \ knotholder.cpp knotholder.h \ knot-holder-entity.h knot-holder-entity.cpp \ + knot-ptr.h knot-ptr.cpp \ layer-fns.cpp layer-fns.h \ layer-manager.cpp layer-manager.h \ layer-model.cpp layer-model.h \ diff --git a/src/knot-ptr.cpp b/src/knot-ptr.cpp new file mode 100644 index 000000000..de8118ba7 --- /dev/null +++ b/src/knot-ptr.cpp @@ -0,0 +1,25 @@ +#include <algorithm> +#include <glib.h> +#include <list> +#include "knot-ptr.h" + +static std::list<void*> deleted_knots; + +void knot_deleted_callback(void* knot) { + if (std::find(deleted_knots.begin(), deleted_knots.end(), knot) == deleted_knots.end()) { + deleted_knots.push_back(knot); + } +} + +void knot_created_callback(void* knot) { + std::list<void*>::iterator it = std::find(deleted_knots.begin(), deleted_knots.end(), knot); + if (it != deleted_knots.end()) { + deleted_knots.erase(it); + } +} + +void check_if_knot_deleted(void* knot) { + if (std::find(deleted_knots.begin(), deleted_knots.end(), knot) != deleted_knots.end()) { + g_warning("Accessed knot after it was freed at %p", knot); + } +} diff --git a/src/knot-ptr.h b/src/knot-ptr.h new file mode 100644 index 000000000..5895dfd2e --- /dev/null +++ b/src/knot-ptr.h @@ -0,0 +1,8 @@ +#ifndef KNOT_PTR_DETECTOR +#define KNOT_PTR_DETECTOR + +void knot_deleted_callback(void* knot); +void knot_created_callback(void* knot); +void check_if_knot_deleted(void* knot); + +#endif diff --git a/src/knot.cpp b/src/knot.cpp index 2f8f55a2e..6205af26a 100644 --- a/src/knot.cpp +++ b/src/knot.cpp @@ -21,6 +21,7 @@ #include "desktop.h" #include "desktop-handles.h" #include "knot.h" +#include "knot-ptr.h" #include "document.h" #include "document-undo.h" #include "preferences.h" @@ -118,6 +119,7 @@ SPKnot::SPKnot(SPDesktop *desktop, gchar const *tip) this->_event_handler_id = g_signal_connect(G_OBJECT(this->item), "event", G_CALLBACK(sp_knot_handler), this); + knot_created_callback(this); } SPKnot::~SPKnot() { @@ -165,6 +167,7 @@ SPKnot::~SPKnot() { // FIXME: cannot snap to destroyed knot (lp:1309050) //sp_event_context_discard_delayed_snap_event(this->desktop->event_context); + knot_deleted_callback(this); } void SPKnot::startDragging(Geom::Point const &p, gint x, gint y, guint32 etime) { diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index f1d90f6c6..c23da87c0 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -58,6 +58,7 @@ #include "sp-guide.h" #include "color.h" #include "knot.h" +#include "knot-ptr.h" // globals for temporary switching to selector by space static bool selector_toggled = FALSE; @@ -1359,6 +1360,7 @@ gboolean sp_event_context_snap_watchdog_callback(gpointer data) { break; case DelayedSnapEvent::KNOT_HANDLER: { gpointer knot = dse->getItem2(); + check_if_knot_deleted(knot); if (knot && SP_IS_KNOT(knot)) { sp_knot_handler_request_position(dse->getEvent(), SP_KNOT(knot)); } |
