Browse Source

Letting empty Buffer heads be automatically reused when cloning.

David Piuva 2 years ago
parent
commit
eea6a5cfe8
2 changed files with 10 additions and 3 deletions
  1. 8 3
      Source/DFPSR/api/bufferAPI.cpp
  2. 2 0
      Source/DFPSR/api/bufferAPI.h

+ 8 - 3
Source/DFPSR/api/bufferAPI.cpp

@@ -103,13 +103,18 @@ BufferImpl::~BufferImpl() {
 
 
 Buffer buffer_clone(const Buffer &buffer) {
 Buffer buffer_clone(const Buffer &buffer) {
 	if (!buffer_exists(buffer)) {
 	if (!buffer_exists(buffer)) {
+		// If the original buffer does not exist, just return another null handle.
 		return Buffer();
 		return Buffer();
 	} else {
 	} else {
-		Buffer newBuffer = std::make_shared<BufferImpl>(buffer->size);
-		if (buffer->size > 0) {
+		if (buffer->size <= 0) {
+			// No need to clone when there is no shared data.
+			return buffer;
+		} else {
+			// Clone the data so that the allocations can be modified individually.
+			Buffer newBuffer = std::make_shared<BufferImpl>(buffer->size);
 			memcpy(newBuffer->data, buffer->data, buffer->size);
 			memcpy(newBuffer->data, buffer->data, buffer->size);
+			return newBuffer;
 		}
 		}
-		return newBuffer;
 	}
 	}
 }
 }
 
 

+ 2 - 0
Source/DFPSR/api/bufferAPI.h

@@ -37,6 +37,8 @@
 //     buffer_getSize(Buffer()) == 0
 //     buffer_getSize(Buffer()) == 0
 // * Empty head, used when loading a file worked but the file itself contained no data.
 // * Empty head, used when loading a file worked but the file itself contained no data.
 //     Size equals zero, but stored in the head.
 //     Size equals zero, but stored in the head.
+//     Empty buffer heads will be reused when cloning, because they do not share any side-effects
+//       when there is no shared data allocation and replacing the destructor will be blocked.
 //     buffer_exists(buffer_create(0)) == true
 //     buffer_exists(buffer_create(0)) == true
 //     buffer_dangerous_getUnsafeData(buffer_create(0)) == nullptr
 //     buffer_dangerous_getUnsafeData(buffer_create(0)) == nullptr
 //     buffer_getSize(buffer_create(0)) == 0
 //     buffer_getSize(buffer_create(0)) == 0