Pārlūkot izejas kodu

add error management for disk and change test

Corentin Salingue 12 gadi atpakaļ
vecāks
revīzija
4c79532333
4 mainītis faili ar 43 papildinājumiem un 19 dzēšanām
  1. 2 2
      include/starpu_disk.h
  2. 6 3
      src/core/disk.c
  3. 29 12
      src/core/disk_ops/disk_stdio.c
  4. 6 2
      tests/disk/disk_copy.c

+ 2 - 2
include/starpu_disk.h

@@ -32,7 +32,7 @@ struct disk_ops {
 	 void *  (*plug)   (void *parameter);
 	 void    (*unplug) (void *base);
 	  int    (*copy)   (void *base_src, void* obj_src, off_t offset_src,  void *base_dst, void* obj_dst, off_t offset_dst, size_t size);
-	 void    (*bandwidth) (unsigned node);
+	  int    (*bandwidth) (unsigned node);
 };
 
 
@@ -41,7 +41,7 @@ extern struct disk_ops write_on_file;
 
 
 /* interface to create and to free a memory disk */
-unsigned starpu_disk_register(struct disk_ops * func, void *parameter, size_t size);
+int starpu_disk_register(struct disk_ops * func, void *parameter, size_t size);
 
 void starpu_disk_unregister(unsigned node);
 

+ 6 - 3
src/core/disk.c

@@ -49,11 +49,11 @@ static int disk_number = -1;
 static int size_register_list = 2;
 
 
-unsigned
+int
 starpu_disk_register(struct disk_ops * func, void *parameter, size_t size)
 {
 
-	STARPU_ASSERT_MSG(size >= SIZE_DISK_MIN,"Minimum disk size is %u Bytes ! (Here %u)", (int) SIZE_DISK_MIN, (int) size);
+	STARPU_ASSERT_MSG(size >= SIZE_DISK_MIN,"Minimum disk size is %u Bytes ! (Here %u) \n", (int) SIZE_DISK_MIN, (int) size);
 	/* register disk */
 	unsigned memory_node = _starpu_memory_node_register(STARPU_DISK_RAM, 0);
 
@@ -66,7 +66,10 @@ starpu_disk_register(struct disk_ops * func, void *parameter, size_t size)
 	/* remember it */
 	add_disk_in_list(memory_node,func,base);
 
-	func->bandwidth(memory_node);
+	int ret = func->bandwidth(memory_node);
+	/* have a problem with the disk */
+	if(ret == 0)
+		return -ENOENT;
 	_starpu_memory_manager_set_global_memory_size(memory_node, size);
 	return memory_node;
 }

+ 29 - 12
src/core/disk_ops/disk_stdio.c

@@ -52,19 +52,33 @@ starpu_stdio_alloc (void *base, size_t size STARPU_ATTRIBUTE_UNUSED)
 
 	char * baseCpy = malloc(sizeBase*sizeof(char));
 	STARPU_ASSERT(baseCpy != NULL);
-	char * tmp = "XXXXXX";
+
+	char * tmp = "STARPU_XXXXXX";
 
 	strcpy(baseCpy, (char *) base);
 	strcat(baseCpy,tmp);
 
 	id = mkstemp(baseCpy);
-	STARPU_ASSERT_MSG(id >= 0, "Stdio allocation failed");
+	/* fail */
+	if (id < 0)
+		return NULL;
 
 	FILE * f = fdopen(id, "rb+");
-	STARPU_ASSERT_MSG(f != NULL, "Stdio allocation failed");
+	/* fail */
+	if (f == NULL)
+	{
+		/* delete fic */
+		unlink(baseCpy);
+		return NULL;
+	}
 
 	int val = ftruncate(id,size);
-	STARPU_ASSERT_MSG(val >= 0, "Stdio allocation failed");
+	/* fail */
+	if (val < 0)
+	{
+		unlink(baseCpy);
+		return NULL;
+	}
 
 	obj->descriptor = id;
 	obj->file = f;
@@ -108,10 +122,12 @@ starpu_stdio_open (void *base, void *pos, size_t size)
 	strcat(baseCpy,(char *) pos);
 
 	int id = open(baseCpy, O_RDONLY);
-	STARPU_ASSERT_MSG(id >= 0, "Unistd open failed");
+	if (id < 0)
+		return NULL;
 
 	FILE * f = fdopen(id,"rb+");
-	STARPU_ASSERT_MSG(f != NULL, "Unistd open failed");
+	if (f == NULL)
+		return NULL;
 
 	obj->descriptor = id;
 	obj->file = f;
@@ -184,7 +200,7 @@ starpu_stdio_unplug (void *base)
 }
 
 
-static void
+static int
 get_stdio_bandwidth_between_disk_and_main_ram(unsigned node)
 {
 
@@ -199,6 +215,9 @@ get_stdio_bandwidth_between_disk_and_main_ram(unsigned node)
 	
 	/* allocate memory */
 	void * mem = _starpu_disk_alloc(node, SIZE_DISK_MIN);
+	/* fail to alloc */
+	if (mem == NULL)
+		return 0;
 	struct starpu_stdio_obj * tmp = (struct starpu_stdio_obj *) mem;
 
 	/* Measure upload slowness */
@@ -208,21 +227,18 @@ get_stdio_bandwidth_between_disk_and_main_ram(unsigned node)
 		_starpu_disk_write(node, mem, buf, 0, SIZE_DISK_MIN);
 		/* clean cache memory */
 		int res = fflush (tmp->file);
-		STARPU_ASSERT_MSG(res == 0, "Slowness computation failed");
+		STARPU_ASSERT_MSG(res == 0, "Slowness computation failed \n");
 
 		res = fsync(tmp->descriptor);
-		STARPU_ASSERT_MSG(res == 0, "Slowness computation failed");
+		STARPU_ASSERT_MSG(res == 0, "Slowness computation failed \n");
 	}
 	gettimeofday(&end, NULL);
 	timing_slowness = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
 
 
 	/* free memory */
-	_starpu_disk_free(node, mem, SIZE_DISK_MIN);
 	free(buf);
 
-	mem = _starpu_disk_alloc(node, SIZE_DISK_MIN);
-	tmp = (struct starpu_stdio_obj *) mem;
 	buf = malloc(sizeof(char));
 	STARPU_ASSERT(buf != NULL);
 
@@ -246,6 +262,7 @@ get_stdio_bandwidth_between_disk_and_main_ram(unsigned node)
 
 	_starpu_save_bandwidth_and_latency_disk((NITER/timing_slowness)*1000000, (NITER/timing_slowness)*1000000,
 					       timing_latency/NITER, timing_latency/NITER, node);
+	return 1;
 }
 
 

+ 6 - 2
tests/disk/disk_copy.c

@@ -38,15 +38,17 @@ int main(int argc, char **argv)
 	/* Initialize StarPU with default configuration */
 	int ret = starpu_init(NULL);
 
+	if (ret == -ENODEV) goto enodev;
+
 	/* register a disk */
 	unsigned dd = starpu_disk_register(&write_on_file, (void *) "/tmp/", 1024*1024*200);
+	/* can't write on /tmp/ */
+	if (dd == -ENOENT) goto enoent;
 
 	/* allocate two memory spaces */
 	starpu_malloc_flags((void **)&A, NX*sizeof(double), STARPU_MALLOC_COUNT);
 	starpu_malloc_flags((void **)&F, NX*sizeof(double), STARPU_MALLOC_COUNT);
 
-	if (ret == -ENODEV) goto enodev;
-
 	FPRINTF(stderr, "TEST DISK MEMORY \n");
 
 	unsigned int j;
@@ -124,4 +126,6 @@ int main(int argc, char **argv)
 
 enodev:
 	return 77;
+enoent:
+	return 77;
 }