Some minor bugfixes
This commit is contained in:
@@ -149,13 +149,14 @@ bool FileClient::enqueue_network_buffer_bytes(const void *snd_buffer, size_t siz
|
||||
return false;
|
||||
}
|
||||
|
||||
void FileClient::flush_network_buffer() {
|
||||
size_t FileClient::flush_network_buffer() {
|
||||
Buffer* current_head;
|
||||
size_t bytes;
|
||||
{
|
||||
std::lock_guard block{this->network_buffer.mutex};
|
||||
|
||||
this->network_buffer.write_disconnected = true;
|
||||
this->network_buffer.bytes = 0;
|
||||
bytes = std::exchange(this->network_buffer.bytes, 0);
|
||||
current_head = std::exchange(this->network_buffer.buffer_head, nullptr);
|
||||
this->network_buffer.buffer_tail = &this->network_buffer.buffer_head;
|
||||
}
|
||||
@@ -165,6 +166,8 @@ void FileClient::flush_network_buffer() {
|
||||
free_buffer(current_head);
|
||||
current_head = next;
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
NetworkingStartResult LocalFileTransfer::start_networking() {
|
||||
@@ -726,7 +729,13 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
}
|
||||
}
|
||||
|
||||
transfer->flush_network_buffer(); /* invalidate all network write operations */
|
||||
/* invalidate all network write operations, but still flush the disk IO buffer */
|
||||
if(size_t bytes_dropped{transfer->flush_network_buffer()}; bytes_dropped > 0) {
|
||||
if(transfer->state != FileClient::STATE_TRANSFERRING) {
|
||||
logWarning(LOG_FT, "{} Dropped {} bytes due to a write error ({}/{})",
|
||||
transfer->log_prefix(), bytes_dropped, errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
std::unique_lock slock{transfer->state_mutex};
|
||||
transfer->handle->disconnect_client(transfer->shared_from_this(), slock, true);
|
||||
return;
|
||||
@@ -773,10 +782,6 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
callback(transfer->transfer);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_lock slock{transfer->state_mutex};
|
||||
/* no need to flush here, since we read only from the disk and all bytes which sould be send have been written already */
|
||||
transfer->handle->disconnect_client(transfer->shared_from_this(), slock, false);
|
||||
return;
|
||||
}
|
||||
transfer->handle->enqueue_disk_io(transfer->shared_from_this());
|
||||
|
||||
Reference in New Issue
Block a user