浏览代码

write the write and full_write for level backend

Corentin Salingue 11 年之前
父节点
当前提交
6662bf44b2
共有 1 个文件被更改,包括 25 次插入24 次删除
  1. 25 24
      src/core/disk_ops/disk_leveldb.cpp

+ 25 - 24
src/core/disk_ops/disk_leveldb.cpp

@@ -117,7 +117,7 @@ starpu_leveldb_close (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, size_t size
 
 /* read the memory disk */
 static int 
-starpu_leveldb_read (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *buf, off_t offset, size_t size, void * async_channel STARPU_ATTRIBUTE_UNUSED)
+starpu_leveldb_read (void *base, void *obj, void *buf, off_t offset, size_t size, void * async_channel STARPU_ATTRIBUTE_UNUSED)
 {
 	struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
 	struct starpu_leveldb_base * base_tmp = (struct starpu_leveldb_base *) base;	
@@ -156,31 +156,39 @@ starpu_leveldb_async_read (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void *
 }
 
 static int
-starpu_leveldb_full_read(unsigned node, void *base STARPU_ATTRIBUTE_UNUSED, void * obj, void ** ptr, size_t * size)
+starpu_leveldb_full_read(unsigned node, void *base, void * obj, void ** ptr, size_t * size)
 {
-	struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
+        struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
+        struct starpu_leveldb_base * base_tmp = (struct starpu_leveldb_base *) base;
 
 	*size = tmp->size;
-	*ptr = malloc(*size);
+	*ptr = (size_t *)malloc(*size);
 	return _starpu_disk_read(node, STARPU_MAIN_RAM, obj, *ptr, 0, *size, NULL);
 }
 
 /* write on the memory disk */
 static int 
-starpu_leveldb_write (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, const void *buf, off_t offset, size_t size, void * async_channel STARPU_ATTRIBUTE_UNUSED)
+starpu_leveldb_write (void *base, void *obj, const void *buf, off_t offset, size_t size, void * async_channel)
 {
-	struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
+        struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
+        struct starpu_leveldb_base * base_tmp = (struct starpu_leveldb_base *) base;
 
 	STARPU_PTHREAD_MUTEX_LOCK(&tmp->mutex);
 
-	int res = fseek(tmp->file, offset, SEEK_SET); 
-	STARPU_ASSERT_MSG(res == 0, "Stdio write failed");
+	uintptr_t buf_tmp = (uintptr_t) buf;
+	void * buffer = (void *) malloc(tmp->size);
+	starpu_leveldb_read (base, obj, buffer, 0, tmp->size, async_channel);
+	memcpy(buffer, (void *) (buf_tmp+offset), size); 
 
-	ssize_t nb = fwrite (buf, 1, size, tmp->file);
+	leveldb::WriteOptions write_options;
+	write_options.sync = true;	
 
+	base_tmp->db->Put(write_options, tmp->key, (char *)buffer);
+
+	free(buffer);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&tmp->mutex);
 
-	return nb;
+	return 0;
 }
 
 static int
@@ -203,31 +211,24 @@ starpu_leveldb_async_write (void *base STARPU_ATTRIBUTE_UNUSED, void *obj, void
 }
 
 static int
-starpu_leveldb_full_write (unsigned node, void * base STARPU_ATTRIBUTE_UNUSED, void * obj, void * ptr, size_t size)
+starpu_leveldb_full_write (unsigned node, void * base, void * obj, void * ptr, size_t size)
 {
 	struct starpu_leveldb_obj * tmp = (struct starpu_leveldb_obj *) obj;
+	struct starpu_leveldb_base * base_tmp = (struct starpu_leveldb_base *) base;
 	
 	/* update file size to realise the next good full_read */
 	if(size != tmp->size)
 	{
 		_starpu_memory_manager_deallocate_size(tmp->size, node);
 		if (_starpu_memory_manager_can_allocate_size(size, node))
-		{
-#ifdef STARPU_HAVE_WINDOWS
-			int val = _chsize(tmp->descriptor, size);
-#else
-			int val = ftruncate(tmp->descriptor,size);
-#endif
-
-			STARPU_ASSERT_MSG(val >= 0,"StarPU Error to truncate file in STDIO full_write function");
 			tmp->size = size;
-		}
 		else
-		{
 			STARPU_ASSERT_MSG(0, "Can't allocate size %u on the disk !", (int) size); 
-		}
 	}	
-	return _starpu_disk_write(STARPU_MAIN_RAM, node, obj, ptr, 0, tmp->size, NULL);
+	leveldb::WriteOptions write_options;
+	write_options.sync = true;
+
+        base_tmp->db->Put(write_options, tmp->key, (char *)ptr);
 }
 
 
@@ -265,7 +266,7 @@ static void
 starpu_leveldb_unplug (void *base)
 {
 	struct starpu_leveldb_base * base_tmp = (struct starpu_leveldb_base *) base;
-	if(tmp->created)
+	if(base_tmp->created)
 		delete base_tmp->db;
 	free(base);
 }