Przeglądaj źródła

Fix resource archive not releasing memory when in development mode

Daniele Bartolini 12 lat temu
rodzic
commit
2e53e7fa90

+ 8 - 1
src/ArchiveResourceArchive.cpp

@@ -76,7 +76,7 @@ ArchiveResourceArchive::~ArchiveResourceArchive()
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-FileStream* ArchiveResourceArchive::find(ResourceId name)
+FileStream* ArchiveResourceArchive::open(ResourceId name)
 {
 {
 	// Search the resource in the archive
 	// Search the resource in the archive
 	for (uint32_t i = 0; i < m_entries_count; i++)
 	for (uint32_t i = 0; i < m_entries_count; i++)
@@ -93,4 +93,11 @@ FileStream* ArchiveResourceArchive::find(ResourceId name)
 	return NULL;
 	return NULL;
 }
 }
 
 
+//-----------------------------------------------------------------------------
+void ArchiveResourceArchive::close(FileStream* resource)
+{
+	// Does nothing, the stream is automatically closed at exit.
+	(void)resource;
+}
+
 } // namespace crown
 } // namespace crown

+ 5 - 1
src/ArchiveResourceArchive.h

@@ -61,7 +61,11 @@ public:
 					ArchiveResourceArchive(Filesystem& fs);
 					ArchiveResourceArchive(Filesystem& fs);
 					~ArchiveResourceArchive();
 					~ArchiveResourceArchive();
 
 
-	FileStream*		find(ResourceId name);
+	/// @copydoc ResourceArchive::open()
+	FileStream*		open(ResourceId name);
+
+	/// @copydoc ResourceArchive::close()
+	void			close(FileStream* resource);
 
 
 private:
 private:
 
 

+ 6 - 2
src/FileResourceArchive.cpp

@@ -46,7 +46,7 @@ FileResourceArchive::~FileResourceArchive()
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-FileStream* FileResourceArchive::find(ResourceId name)
+FileStream* FileResourceArchive::open(ResourceId name)
 {
 {
 	// Convert name/type into strings
 	// Convert name/type into strings
 	char resource_name[512];
 	char resource_name[512];
@@ -65,8 +65,12 @@ FileStream* FileResourceArchive::find(ResourceId name)
 	file->skip(sizeof(ResourceHeader));
 	file->skip(sizeof(ResourceHeader));
 
 
 	return file;
 	return file;
+}
 
 
-	// FIXME NEED TO RELEASE MEMORY FOR file
+//-----------------------------------------------------------------------------
+void FileResourceArchive::close(FileStream* resource)
+{
+	m_filesystem.close(resource);
 }
 }
 
 
 } // namespace crown
 } // namespace crown

+ 6 - 1
src/FileResourceArchive.h

@@ -53,7 +53,12 @@ public:
 					FileResourceArchive(Filesystem& fs);
 					FileResourceArchive(Filesystem& fs);
 					~FileResourceArchive();
 					~FileResourceArchive();
 
 
-	FileStream*		find(ResourceId name);
+	/// @copydoc ResourceArchive::open()
+	FileStream*		open(ResourceId name);
+
+	/// @copydoc ResourceArchive::close()
+	void			close(FileStream* resource);
+
 
 
 private:
 private:
 
 

+ 10 - 1
src/ResourceArchive.h

@@ -57,7 +57,16 @@ public:
 
 
 	virtual					~ResourceArchive() {}
 	virtual					~ResourceArchive() {}
 
 
-	virtual FileStream*		find(ResourceId name) = 0;
+	/// Opens the resource file containing @name resource
+	/// and returns a stream from which read the data from.
+	/// @note
+	/// The resource stream points exactly at the start
+	/// of the useful resource data, so you do not have to
+	/// care about skipping headers, metadatas and so on.
+	virtual FileStream*		open(ResourceId name) = 0;
+
+	/// Closes the resource file.
+	virtual void			close(FileStream* resource) = 0;
 };
 };
 
 
 } // namespace crown
 } // namespace crown

+ 3 - 1
src/ScriptResource.cpp

@@ -12,7 +12,7 @@ namespace crown
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void* ScriptResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 void* ScriptResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 {
 {
-	FileStream* stream = archive.find(id);
+	FileStream* stream = archive.open(id);
 
 
 	if (stream != NULL)
 	if (stream != NULL)
 	{
 	{
@@ -24,6 +24,8 @@ void* ScriptResource::load(Allocator& allocator, ResourceArchive& archive, Resou
 
 
 		stream->read(resource->m_data, size);
 		stream->read(resource->m_data, size);
 
 
+		archive.close(stream);
+
 		return resource;
 		return resource;
 	}
 	}
 
 

+ 3 - 1
src/TextResource.cpp

@@ -10,7 +10,7 @@ namespace crown
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void* TextResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 void* TextResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 {
 {
-	FileStream* stream = archive.find(id);
+	FileStream* stream = archive.open(id);
 
 
 	if (stream != NULL)
 	if (stream != NULL)
 	{
 	{
@@ -24,6 +24,8 @@ void* TextResource::load(Allocator& allocator, ResourceArchive& archive, Resourc
 		
 		
 		resource->data[resource->length] = '\0';
 		resource->data[resource->length] = '\0';
 
 
+		archive.close(stream);
+
 		return resource;
 		return resource;
 	}
 	}
 
 

+ 3 - 1
src/TextureResource.cpp

@@ -13,7 +13,7 @@ namespace crown
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void* TextureResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 void* TextureResource::load(Allocator& allocator, ResourceArchive& archive, ResourceId id)
 {
 {
-	FileStream* stream = archive.find(id);
+	FileStream* stream = archive.open(id);
 
 
 	if (stream != NULL)
 	if (stream != NULL)
 	{
 	{
@@ -29,6 +29,8 @@ void* TextureResource::load(Allocator& allocator, ResourceArchive& archive, Reso
 
 
 		stream->read(resource->m_data, size);
 		stream->read(resource->m_data, size);
 
 
+		archive.close(stream);
+
 		return resource;
 		return resource;
 	}
 	}