Fix (unreported) error on freeing timers which customdata pointer shall not be freed.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 9 Feb 2018 16:19:11 +0000 (17:19 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 9 Feb 2018 16:23:35 +0000 (17:23 +0100)
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
source/blender/windowmanager/intern/wm_window.c

index 0f7d41295f1428af5940c57f0f03ab602c8c2b71..8fca0ce959e77d328afa2c25c6bc9109b0abb3ad 100644 (file)
@@ -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 {
index 79078b321dadf0700514295974580a9444a720ed..bf3d28e39e0e1db27f9e5dd595761300cb9642ae 100644 (file)
@@ -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 */