瀏覽代碼

port r11357 from 1.1: Fix memleak

Samuel Thibault 11 年之前
父節點
當前提交
4ce5fe9027

+ 0 - 2
src/core/workers.c

@@ -997,8 +997,6 @@ int starpu_initialize(struct starpu_conf *user_conf, int *argc, char ***argv)
 
 	_starpu_data_interface_init();
 
-	_starpu_malloc_init();
-
 	_starpu_timing_init();
 
 	_starpu_profiling_init();

+ 8 - 8
src/datawizard/malloc.c

@@ -587,15 +587,11 @@ static int nfreechunks[STARPU_MAXNODES];
 static starpu_pthread_mutex_t chunk_mutex[STARPU_MAXNODES];
 
 void
-_starpu_malloc_init(void)
+_starpu_malloc_init(unsigned dst_node)
 {
-	int i;
-	for (i = 0; i < STARPU_MAXNODES; i++)
-	{
-		chunks[i] = _starpu_chunk_list_new();
-		nfreechunks[i] = 0;
-		STARPU_PTHREAD_MUTEX_INIT(&chunk_mutex[i], NULL);
-	}
+	chunks[dst_node] = _starpu_chunk_list_new();
+	nfreechunks[dst_node] = 0;
+	STARPU_PTHREAD_MUTEX_INIT(&chunk_mutex[dst_node], NULL);
 }
 
 void
@@ -603,6 +599,9 @@ _starpu_malloc_shutdown(unsigned dst_node)
 {
 	struct _starpu_chunk *chunk, *next_chunk;
 
+	if (!chunks[dst_node])
+		return;
+
 	STARPU_PTHREAD_MUTEX_LOCK(&chunk_mutex[dst_node]);
 	for (chunk = _starpu_chunk_list_begin(chunks[dst_node]);
 	     chunk != _starpu_chunk_list_end(chunks[dst_node]);
@@ -614,6 +613,7 @@ _starpu_malloc_shutdown(unsigned dst_node)
 		free(chunk);
 	}
 	_starpu_chunk_list_delete(chunks[dst_node]);
+	chunks[dst_node] = NULL;
 	STARPU_PTHREAD_MUTEX_UNLOCK(&chunk_mutex[dst_node]);
 	STARPU_PTHREAD_MUTEX_DESTROY(&chunk_mutex[dst_node]);
 }

+ 1 - 1
src/datawizard/malloc.h

@@ -17,7 +17,7 @@
 #ifndef __ALLOC_H__
 #define __ALLOC_H__
 
-void _starpu_malloc_init(void);
+void _starpu_malloc_init(unsigned dst_node);
 void _starpu_malloc_shutdown(unsigned dst_node);
 
 #endif

+ 1 - 0
src/drivers/cpu/driver_cpu.c

@@ -29,6 +29,7 @@
 #include "driver_cpu.h"
 #include <core/sched_policy.h>
 #include <datawizard/memory_manager.h>
+#include <datawizard/malloc.h>
 
 #ifdef STARPU_HAVE_HWLOC
 #include <hwloc.h>

+ 2 - 0
src/drivers/cuda/driver_cuda.c

@@ -401,6 +401,8 @@ int _starpu_cuda_driver_init(struct starpu_driver *d)
 	_starpu_cuda_limit_gpu_mem_if_needed(devid);
 	_starpu_memory_manager_set_global_memory_size(args->memory_node, _starpu_cuda_get_global_mem_size(devid));
 
+	_starpu_malloc_init(args->memory_node);
+
 	/* one more time to avoid hacks from third party lib :) */
 	_starpu_bind_thread_on_cpu(args->config, args->bindid);
 

+ 5 - 0
src/drivers/opencl/driver_opencl.c

@@ -29,6 +29,7 @@
 #include "driver_opencl_utils.h"
 #include <common/utils.h>
 #include <datawizard/memory_manager.h>
+#include <datawizard/malloc.h>
 
 #ifdef STARPU_SIMGRID
 #include <core/simgrid.h>
@@ -611,6 +612,8 @@ int _starpu_opencl_driver_init(struct starpu_driver *d)
 	_starpu_opencl_limit_gpu_mem_if_needed(devid);
 	_starpu_memory_manager_set_global_memory_size(args->memory_node, _starpu_opencl_get_global_mem_size(devid));
 
+	_starpu_malloc_init(args->memory_node);
+
 	args->status = STATUS_UNKNOWN;
 	float size = (float) global_mem[devid] / (1<<30);
 
@@ -713,6 +716,8 @@ int _starpu_opencl_driver_deinit(struct starpu_driver *d)
 	 * coherency is not maintained anymore at that point ! */
 	_starpu_free_all_automatically_allocated_buffers(memnode);
 
+	_starpu_malloc_shutdown(memnode);
+
 #ifndef STARPU_SIMGRID
 	unsigned devid   = args->devid;
         _starpu_opencl_deinit_context(devid);