On 21.10.2016 18:34, Eduardo Lima Mitev wrote:
On 10/20/2016 08:45 PM, Steven Toth wrote:
In the event that multiple threads attempt to install a graph
concurrently, protect the shared list.

Signed-off-by: Steven Toth <[email protected]>
---
 src/gallium/auxiliary/hud/hud_cpufreq.c      | 12 ++++++++++--
 src/gallium/auxiliary/hud/hud_diskstat.c     | 13 +++++++++++--
 src/gallium/auxiliary/hud/hud_nic.c          | 12 ++++++++++--
 src/gallium/auxiliary/hud/hud_sensors_temp.c | 12 ++++++++++--
 4 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/src/gallium/auxiliary/hud/hud_cpufreq.c 
b/src/gallium/auxiliary/hud/hud_cpufreq.c
index e66c3e4..19a6f08 100644
--- a/src/gallium/auxiliary/hud/hud_cpufreq.c
+++ b/src/gallium/auxiliary/hud/hud_cpufreq.c
@@ -36,6 +36,7 @@
 #include "hud/hud_private.h"
 #include "util/list.h"
 #include "os/os_time.h"
+#include "os/os_thread.h"
 #include "util/u_memory.h"
 #include <stdio.h>
 #include <unistd.h>
@@ -61,6 +62,7 @@ struct cpufreq_info

 static int gcpufreq_count = 0;
 static struct list_head gcpufreq_list;
+pipe_static_mutex(gcpufreq_mutex);

 static struct cpufreq_info *
 find_cfi_by_index(int cpu_index, int mode)
@@ -186,16 +188,21 @@ hud_get_num_cpufreq(bool displayhelp)
    int cpu_index;

    /* Return the number of CPU metrics we support. */
-   if (gcpufreq_count)
+   pipe_mutex_lock(gcpufreq_mutex);
+   if (gcpufreq_count) {
+      pipe_mutex_unlock(gcpufreq_mutex);
       return gcpufreq_count;
+   }


Notice that this won't return the correct value. The value of
'gcpufreq_count' might have changed to zero between the unlock and the
return. Maybe what you want is to save the value in a temporary variable
inside the protected region, then return that temporary. Something like:

int tmp_count;
pipe_mutex_lock(gcpufreq_mutex);
if (gcpufreq_count) {
   tmp_count = gcpufreq_count;
   pipe_mutex_unlock(gcpufreq_mutex);
   return tmp_count;
}

Same comment applies to several other similar chunks in this patch.

I actually think the code is fine as is, because gcpufreq_count is only set _once_ by hud_get_num_cpufreq while holding the lock. So if we find that gcpufreq_count != 0 while holding the lock, we have a guarantee that nobody will ever change that variable again.

Nicolai
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to