diff --git a/file/local_server/LocalFileTransfer.cpp b/file/local_server/LocalFileTransfer.cpp index 7d79953..a02a7e9 100644 --- a/file/local_server/LocalFileTransfer.cpp +++ b/file/local_server/LocalFileTransfer.cpp @@ -19,6 +19,7 @@ Buffer* transfer::allocate_buffer(size_t size) { auto buffer = (Buffer*) malloc(total_size); new (buffer) Buffer{}; buffer->capacity = size; + buffer->ref_count = 1; return buffer; } diff --git a/file/local_server/LocalFileTransferDisk.cpp b/file/local_server/LocalFileTransferDisk.cpp index 5d21850..3f187a5 100644 --- a/file/local_server/LocalFileTransferDisk.cpp +++ b/file/local_server/LocalFileTransferDisk.cpp @@ -492,13 +492,14 @@ void LocalFileTransfer::execute_disk_io(const std::shared_ptr<FileClient> &clien assert(client->disk_buffer.bytes >= written); client->disk_buffer.bytes -= written; buffer_left_size = client->disk_buffer.bytes; + + /* We have to deref the buffer twice since we've removed it from the list which owns us one reference */ + /* Will not trigger a memory free since we're still holding onto one reference */ + deref_buffer(buffer); } else { /* The buffer got removed */ } } - - /* We have to deref the buffer twice since we've removed it from the list which owns us one reference */ - deref_buffer(buffer); } else { std::lock_guard block{client->disk_buffer.mutex}; if(client->disk_buffer.buffer_head == buffer) { diff --git a/file/local_server/LocalFileTransferNetwork.cpp b/file/local_server/LocalFileTransferNetwork.cpp index 4f90b26..61ac1b5 100644 --- a/file/local_server/LocalFileTransferNetwork.cpp +++ b/file/local_server/LocalFileTransferNetwork.cpp @@ -801,17 +801,20 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo std::lock_guard block{transfer->network_buffer.mutex}; if(transfer->network_buffer.buffer_head == buffer) { transfer->network_buffer.buffer_head = buffer->next; - if(!buffer->next) + if(!buffer->next) { transfer->network_buffer.buffer_tail = &transfer->network_buffer.buffer_head; + } + assert(transfer->network_buffer.bytes >= written); transfer->network_buffer.bytes -= written; buffer_left_size = transfer->network_buffer.bytes; + + /* Will not trigger a memory free since we're still holding onto one reference */ + deref_buffer(buffer); } else { /* the buffer got remove */ } } - - deref_buffer(buffer); } else { std::lock_guard block{transfer->network_buffer.mutex}; if(transfer->network_buffer.buffer_head == buffer) { @@ -819,7 +822,7 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo transfer->network_buffer.bytes -= written; buffer_left_size = transfer->network_buffer.bytes; } else { - /* the buffer got remove */ + /* the buffer got removed */ } }