Explorar o código

src/datawizard/memory_manager.c: protect access to used_size array

Nathalie Furmento %!s(int64=12) %!d(string=hai) anos
pai
achega
ba73ca16c9
Modificáronse 1 ficheiros con 13 adicións e 3 borrados
  1. 13 3
      src/datawizard/memory_manager.c

+ 13 - 3
src/datawizard/memory_manager.c

@@ -16,10 +16,12 @@
 
 #include <starpu.h>
 #include <common/utils.h>
+#include <common/thread.h>
 #include <datawizard/memory_manager.h>
 
 static size_t global_size[STARPU_MAXNODES];
 static size_t used_size[STARPU_MAXNODES];
+static starpu_pthread_mutex_t lock_nodes[STARPU_MAXNODES];
 
 int _starpu_memory_manager_init()
 {
@@ -29,6 +31,7 @@ int _starpu_memory_manager_init()
 	{
 		global_size[i] = 0;
 		used_size[i] = 0;
+		_STARPU_PTHREAD_MUTEX_INIT(&lock_nodes[i], NULL);
 	}
 	return 0;
 }
@@ -47,26 +50,33 @@ size_t _starpu_memory_manager_get_global_memory_size(unsigned node)
 
 int _starpu_memory_manager_can_allocate_size(size_t size, unsigned node)
 {
+	int ret;
+
+	_STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]);
 	if (global_size[node] == 0)
 	{
 		// We do not have information on the available size, let's suppose it is going to fit
 		used_size[node] += size;
-		return 1;
+		ret = 1;
 	}
 	else if (used_size[node] + size < global_size[node])
 	{
 		used_size[node] += size;
-		return 1;
+		ret = 1;
 	}
 	else
 	{
-		return 0;
+		ret = 0;
 	}
+	_STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]);
+	return ret;
 }
 
 void _starpu_memory_manager_deallocate_size(size_t size, unsigned node)
 {
+	_STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]);
 	used_size[node] -= size;
+	_STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]);
 }
 
 ssize_t starpu_memory_get_available(unsigned node)