diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-02-09 19:19:11 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-02-09 19:23:35 +0300 |
commit | 3ab5ef7b4f34f110e4861096428b83b4f9b5efe9 (patch) | |
tree | fe05c448ebc4bf31ead0b98096488fe983d8a0d6 /source/blender | |
parent | ea9099473a545ae1992ae0fbc4ba0bf09cff1bd9 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 7 | ||||
-rw-r--r-- | 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 */ |