From 3ab5ef7b4f34f110e4861096428b83b4f9b5efe9 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 9 Feb 2018 17:19:11 +0100 Subject: Fix (unreported) error on freeing timers which customdata pointer shall not be freed. Looks like there was no way to avoid that so far, since WM_event_add_timer_notifier can set mere int-in-pointer there, this can cause issues. So added mere flags system to wmTimer to allow controlling this. --- source/blender/windowmanager/WM_types.h | 7 ++++++- source/blender/windowmanager/intern/wm_window.c | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 0f7d41295f1..8fca0ce959e 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -508,6 +508,10 @@ typedef struct wmNDOFMotionData { } wmNDOFMotionData; #endif /* WITH_INPUT_NDOF */ +typedef enum { /* Timer flags */ + WM_TIMER_NO_FREE_CUSTOM_DATA = 1 << 0, /* Do not attempt to free customdata pointer even if non-NULL. */ +} wmTimerFlags; + typedef struct wmTimer { struct wmTimer *next, *prev; @@ -515,6 +519,7 @@ typedef struct wmTimer { double timestep; /* set by timer user */ int event_type; /* set by timer user, goes to event system */ + wmTimerFlags flags; /* Various flags controlling timer options, see below. */ void *customdata; /* set by timer user, to allow custom values */ double duration; /* total running time in seconds */ @@ -523,7 +528,7 @@ typedef struct wmTimer { double ltime; /* internal, last time timer was activated */ double ntime; /* internal, next time we want to activate the timer */ double stime; /* internal, when the timer started */ - int sleep; /* internal, put timers to sleep when needed */ + bool sleep; /* internal, put timers to sleep when needed */ } wmTimer; typedef struct wmOperatorType { diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 79078b321da..bf3d28e39e0 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1466,6 +1466,7 @@ wmTimer *WM_event_add_timer_notifier(wmWindowManager *wm, wmWindow *win, unsigne wt->timestep = timestep; wt->win = win; wt->customdata = SET_UINT_IN_POINTER(type); + wt->flags |= WM_TIMER_NO_FREE_CUSTOM_DATA; BLI_addtail(&wm->timers, wt); @@ -1487,8 +1488,9 @@ void WM_event_remove_timer(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer * wm->reports.reporttimer = NULL; BLI_remlink(&wm->timers, wt); - if (wt->customdata) + if (wt->customdata != NULL && (wt->flags & WM_TIMER_NO_FREE_CUSTOM_DATA) == 0) { MEM_freeN(wt->customdata); + } MEM_freeN(wt); /* there might be events in queue with this timer as customdata */ -- cgit v1.2.3