Fixed a crash
This commit is contained in:
parent
3c0c48c00c
commit
a233915064
@ -19,6 +19,7 @@ Buffer* transfer::allocate_buffer(size_t size) {
|
|||||||
auto buffer = (Buffer*) malloc(total_size);
|
auto buffer = (Buffer*) malloc(total_size);
|
||||||
new (buffer) Buffer{};
|
new (buffer) Buffer{};
|
||||||
buffer->capacity = size;
|
buffer->capacity = size;
|
||||||
|
buffer->ref_count = 1;
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -492,13 +492,14 @@ void LocalFileTransfer::execute_disk_io(const std::shared_ptr<FileClient> &clien
|
|||||||
assert(client->disk_buffer.bytes >= written);
|
assert(client->disk_buffer.bytes >= written);
|
||||||
client->disk_buffer.bytes -= written;
|
client->disk_buffer.bytes -= written;
|
||||||
buffer_left_size = client->disk_buffer.bytes;
|
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 {
|
} else {
|
||||||
/* The buffer got removed */
|
/* 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 {
|
} else {
|
||||||
std::lock_guard block{client->disk_buffer.mutex};
|
std::lock_guard block{client->disk_buffer.mutex};
|
||||||
if(client->disk_buffer.buffer_head == buffer) {
|
if(client->disk_buffer.buffer_head == buffer) {
|
||||||
|
@ -801,17 +801,20 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
|||||||
std::lock_guard block{transfer->network_buffer.mutex};
|
std::lock_guard block{transfer->network_buffer.mutex};
|
||||||
if(transfer->network_buffer.buffer_head == buffer) {
|
if(transfer->network_buffer.buffer_head == buffer) {
|
||||||
transfer->network_buffer.buffer_head = buffer->next;
|
transfer->network_buffer.buffer_head = buffer->next;
|
||||||
if(!buffer->next)
|
if(!buffer->next) {
|
||||||
transfer->network_buffer.buffer_tail = &transfer->network_buffer.buffer_head;
|
transfer->network_buffer.buffer_tail = &transfer->network_buffer.buffer_head;
|
||||||
|
}
|
||||||
|
|
||||||
assert(transfer->network_buffer.bytes >= written);
|
assert(transfer->network_buffer.bytes >= written);
|
||||||
transfer->network_buffer.bytes -= written;
|
transfer->network_buffer.bytes -= written;
|
||||||
buffer_left_size = transfer->network_buffer.bytes;
|
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 {
|
} else {
|
||||||
/* the buffer got remove */
|
/* the buffer got remove */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deref_buffer(buffer);
|
|
||||||
} else {
|
} else {
|
||||||
std::lock_guard block{transfer->network_buffer.mutex};
|
std::lock_guard block{transfer->network_buffer.mutex};
|
||||||
if(transfer->network_buffer.buffer_head == buffer) {
|
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;
|
transfer->network_buffer.bytes -= written;
|
||||||
buffer_left_size = transfer->network_buffer.bytes;
|
buffer_left_size = transfer->network_buffer.bytes;
|
||||||
} else {
|
} else {
|
||||||
/* the buffer got remove */
|
/* the buffer got removed */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user