gallium/hud: fix a problem where objects are free'd while in use.
authorSteven Toth <stoth@kernellabs.com>
Mon, 24 Oct 2016 14:10:49 +0000 (10:10 -0400)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 7 Nov 2016 17:31:52 +0000 (18:31 +0100)
Instead of trying to maintain a reference counted list of valid HUD
objects, and freeing them accordingly, creating race conditions
between unanticipated multiple threads, simply accept they're
allocated once and never released until the process terminates.

They're a shared resource between multiple threads, so accept
they're always available for use.

Signed-off-by: Steven Toth <stoth@kernellabs.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/hud/hud_cpufreq.c
src/gallium/auxiliary/hud/hud_diskstat.c
src/gallium/auxiliary/hud/hud_nic.c
src/gallium/auxiliary/hud/hud_sensors_temp.c

index 4501bbbc38cc21c624253a16118e82dd1cf7950d..bfc748b47f9e8256b1120416e0c613a03bea818b 100644 (file)
@@ -112,14 +112,6 @@ query_cfi_load(struct hud_graph *gr)
    }
 }
 
-static void
-free_query_data(void *p)
-{
-   struct cpufreq_info *cfi = (struct cpufreq_info *)p;
-   list_del(&cfi->list);
-   FREE(cfi);
-}
-
 /**
   * Create and initialize a new object for a specific CPU.
   * \param  pane  parent context.
@@ -162,11 +154,6 @@ hud_cpufreq_graph_install(struct hud_pane *pane, int cpu_index,
    gr->query_data = cfi;
    gr->query_new_value = query_cfi_load;
 
-   /* Don't use free() as our callback as that messes up Gallium's
-    * memory debugger.  Use simple free_query_data() wrapper.
-    */
-   gr->free_query_data = free_query_data;
-
    hud_pane_add_graph(pane, gr);
    hud_pane_set_max_value(pane, 3000000 /* 3 GHz */);
 }
index b248baf5d68bea9d33021f0beacdda7df75fd9da..7d4f5001a3de425c9098a2c3316a6d1fdd155494 100644 (file)
@@ -162,14 +162,6 @@ query_dsi_load(struct hud_graph *gr)
    }
 }
 
-static void
-free_query_data(void *p)
-{
-   struct diskstat_info *nic = (struct diskstat_info *) p;
-   list_del(&nic->list);
-   FREE(nic);
-}
-
 /**
   * Create and initialize a new object for a specific block I/O device.
   * \param  pane  parent context.
@@ -208,11 +200,6 @@ hud_diskstat_graph_install(struct hud_pane *pane, const char *dev_name,
    gr->query_data = dsi;
    gr->query_new_value = query_dsi_load;
 
-   /* Don't use free() as our callback as that messes up Gallium's
-    * memory debugger.  Use simple free_query_data() wrapper.
-    */
-   gr->free_query_data = free_query_data;
-
    hud_pane_add_graph(pane, gr);
    hud_pane_set_max_value(pane, 100);
 }
index fb6b8c0524b91962c391ffba7d255d0421ac0e7c..719dd04a5819e7dab131954cb0502fa8e5f807e6 100644 (file)
@@ -234,14 +234,6 @@ query_nic_load(struct hud_graph *gr)
    }
 }
 
-static void
-free_query_data(void *p)
-{
-   struct nic_info *nic = (struct nic_info *) p;
-   list_del(&nic->list);
-   FREE(nic);
-}
-
 /**
   * Create and initialize a new object for a specific network interface dev.
   * \param  pane  parent context.
@@ -284,11 +276,6 @@ hud_nic_graph_install(struct hud_pane *pane, const char *nic_name,
    gr->query_data = nic;
    gr->query_new_value = query_nic_load;
 
-   /* Don't use free() as our callback as that messes up Gallium's
-    * memory debugger.  Use simple free_query_data() wrapper.
-    */
-   gr->free_query_data = free_query_data;
-
    hud_pane_add_graph(pane, gr);
    hud_pane_set_max_value(pane, 100);
 }
index e41b8472624f5bdbc4099d35e5b48dcf20bfee1e..4a8a4fc8c54d9e101d2224b13385d42270dae830 100644 (file)
@@ -189,17 +189,6 @@ query_sti_load(struct hud_graph *gr)
    }
 }
 
-static void
-free_query_data(void *p)
-{
-   struct sensors_temp_info *sti = (struct sensors_temp_info *) p;
-   list_del(&sti->list);
-   if (sti->chip)
-      sensors_free_chip_name(sti->chip);
-   FREE(sti);
-   sensors_cleanup();
-}
-
 /**
   * Create and initialize a new object for a specific sensor interface dev.
   * \param  pane  parent context.
@@ -237,11 +226,6 @@ hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
    gr->query_data = sti;
    gr->query_new_value = query_sti_load;
 
-   /* Don't use free() as our callback as that messes up Gallium's
-    * memory debugger.  Use simple free_query_data() wrapper.
-    */
-   gr->free_query_data = free_query_data;
-
    hud_pane_add_graph(pane, gr);
    switch (sti->mode) {
    case SENSORS_TEMP_CURRENT: