In the event that multiple threads attempt to install a graph
concurrently, protect the shared list.
Signed-off-by: Steven Toth <stoth@kernellabs.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
#include "hud/hud_private.h"
#include "util/list.h"
#include "os/os_time.h"
#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>
#include "util/u_memory.h"
#include <stdio.h>
#include <unistd.h>
static int gcpufreq_count = 0;
static struct list_head gcpufreq_list;
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)
static struct cpufreq_info *
find_cfi_by_index(int cpu_index, int mode)
int cpu_index;
/* Return the number of CPU metrics we support. */
int cpu_index;
/* Return the number of CPU metrics we support. */
+ pipe_mutex_lock(gcpufreq_mutex);
+ if (gcpufreq_count) {
+ pipe_mutex_unlock(gcpufreq_mutex);
/* Scan /sys/devices.../cpu, for every object type we support, create
* and persist an object to represent its different metrics.
*/
list_inithead(&gcpufreq_list);
DIR *dir = opendir("/sys/devices/system/cpu");
/* Scan /sys/devices.../cpu, for every object type we support, create
* and persist an object to represent its different metrics.
*/
list_inithead(&gcpufreq_list);
DIR *dir = opendir("/sys/devices/system/cpu");
+ if (!dir) {
+ pipe_mutex_unlock(gcpufreq_mutex);
while ((dp = readdir(dir)) != NULL) {
while ((dp = readdir(dir)) != NULL) {
+ pipe_mutex_unlock(gcpufreq_mutex);
#include "hud/hud_private.h"
#include "util/list.h"
#include "os/os_time.h"
#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>
#include "util/u_memory.h"
#include <stdio.h>
#include <unistd.h>
*/
static int gdiskstat_count = 0;
static struct list_head gdiskstat_list;
*/
static int gdiskstat_count = 0;
static struct list_head gdiskstat_list;
+pipe_static_mutex(gdiskstat_mutex);
static struct diskstat_info *
find_dsi_by_name(const char *n, int mode)
static struct diskstat_info *
find_dsi_by_name(const char *n, int mode)
char name[64];
/* Return the number of block devices and partitions. */
char name[64];
/* Return the number of block devices and partitions. */
+ pipe_mutex_lock(gdiskstat_mutex);
+ if (gdiskstat_count) {
+ pipe_mutex_unlock(gdiskstat_mutex);
/* Scan /sys/block, for every object type we support, create and
* persist an object to represent its different statistics.
*/
list_inithead(&gdiskstat_list);
DIR *dir = opendir("/sys/block/");
/* Scan /sys/block, for every object type we support, create and
* persist an object to represent its different statistics.
*/
list_inithead(&gdiskstat_list);
DIR *dir = opendir("/sys/block/");
+ if (!dir) {
+ pipe_mutex_unlock(gdiskstat_mutex);
while ((dp = readdir(dir)) != NULL) {
while ((dp = readdir(dir)) != NULL) {
struct dirent *dpart;
DIR *pdir = opendir(basename);
if (!pdir) {
struct dirent *dpart;
DIR *pdir = opendir(basename);
if (!pdir) {
+ pipe_mutex_unlock(gdiskstat_mutex);
closedir(dir);
return 0;
}
closedir(dir);
return 0;
}
+ pipe_mutex_unlock(gdiskstat_mutex);
return gdiskstat_count;
}
return gdiskstat_count;
}
#include "hud/hud_private.h"
#include "util/list.h"
#include "os/os_time.h"
#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>
#include "util/u_memory.h"
#include <stdio.h>
#include <unistd.h>
*/
static int gnic_count = 0;
static struct list_head gnic_list;
*/
static int gnic_count = 0;
static struct list_head gnic_list;
+pipe_static_mutex(gnic_mutex);
static struct nic_info *
find_nic_by_name(const char *n, int mode)
static struct nic_info *
find_nic_by_name(const char *n, int mode)
char name[64];
/* Return the number if network interfaces. */
char name[64];
/* Return the number if network interfaces. */
+ pipe_mutex_lock(gnic_mutex);
+ if (gnic_count) {
+ pipe_mutex_unlock(gnic_mutex);
/* Scan /sys/block, for every object type we support, create and
* persist an object to represent its different statistics.
*/
list_inithead(&gnic_list);
DIR *dir = opendir("/sys/class/net/");
/* Scan /sys/block, for every object type we support, create and
* persist an object to represent its different statistics.
*/
list_inithead(&gnic_list);
DIR *dir = opendir("/sys/class/net/");
+ if (!dir) {
+ pipe_mutex_unlock(gnic_mutex);
while ((dp = readdir(dir)) != NULL) {
while ((dp = readdir(dir)) != NULL) {
+ pipe_mutex_unlock(gnic_mutex);
#include "hud/hud_private.h"
#include "util/list.h"
#include "os/os_time.h"
#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>
#include "util/u_memory.h"
#include <stdio.h>
#include <unistd.h>
*/
static int gsensors_temp_count = 0;
static struct list_head gsensors_temp_list;
*/
static int gsensors_temp_count = 0;
static struct list_head gsensors_temp_list;
+pipe_static_mutex(gsensor_temp_mutex);
struct sensors_temp_info
{
struct sensors_temp_info
{
hud_get_num_sensors(bool displayhelp)
{
/* Return the number of sensors detected. */
hud_get_num_sensors(bool displayhelp)
{
/* Return the number of sensors detected. */
- if (gsensors_temp_count)
+ pipe_mutex_lock(gsensor_temp_mutex);
+ if (gsensors_temp_count) {
+ pipe_mutex_unlock(gsensor_temp_mutex);
return gsensors_temp_count;
return gsensors_temp_count;
int ret = sensors_init(NULL);
int ret = sensors_init(NULL);
+ if (ret) {
+ pipe_mutex_unlock(gsensor_temp_mutex);
list_inithead(&gsensors_temp_list);
list_inithead(&gsensors_temp_list);
+ pipe_mutex_unlock(gsensor_temp_mutex);
return gsensors_temp_count;
}
return gsensors_temp_count;
}