mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
fix: don't count filetransfer as sending until accepted
This fixes high CPU load in c-toxcore due to started but not accepted file transfers causing lots of iterations in do_all_filetransfers(...). Additionally this skips expensive calls max_speed_reached(...).
This commit is contained in:
parent
4a2cb37e4b
commit
2073d02c33
|
@ -1148,8 +1148,6 @@ long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_
|
||||||
|
|
||||||
memcpy(ft->id, file_id, FILE_ID_LENGTH);
|
memcpy(ft->id, file_id, FILE_ID_LENGTH);
|
||||||
|
|
||||||
++m->friendlist[friendnumber].num_sending_files;
|
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1255,11 +1253,12 @@ int file_control(const Messenger *m, int32_t friendnumber, uint32_t filenumber,
|
||||||
|
|
||||||
if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, nullptr, 0)) {
|
if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, nullptr, 0)) {
|
||||||
if (control == FILECONTROL_KILL) {
|
if (control == FILECONTROL_KILL) {
|
||||||
ft->status = FILESTATUS_NONE;
|
if (send_receive == 0 && (ft->status == FILESTATUS_TRANSFERRING || ft->status == FILESTATUS_FINISHED)) {
|
||||||
|
// We are actively sending that file, remove from list
|
||||||
if (send_receive == 0) {
|
|
||||||
--m->friendlist[friendnumber].num_sending_files;
|
--m->friendlist[friendnumber].num_sending_files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ft->status = FILESTATUS_NONE;
|
||||||
} else if (control == FILECONTROL_PAUSE) {
|
} else if (control == FILECONTROL_PAUSE) {
|
||||||
ft->paused |= FILE_PAUSE_US;
|
ft->paused |= FILE_PAUSE_US;
|
||||||
} else if (control == FILECONTROL_ACCEPT) {
|
} else if (control == FILECONTROL_ACCEPT) {
|
||||||
|
@ -1465,15 +1464,13 @@ static bool do_all_filetransfers(Messenger *m, int32_t friendnumber, void *userd
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id(
|
|
||||||
m->fr_c, friendcon->friendcon_id))) {
|
|
||||||
LOGGER_TRACE(m->log, "Maximum connection speed reached");
|
|
||||||
// connection doesn't support any more data
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct File_Transfers *const ft = &friendcon->file_sending[i];
|
struct File_Transfers *const ft = &friendcon->file_sending[i];
|
||||||
|
|
||||||
|
if (ft->status == FILESTATUS_NONE || ft->status == FILESTATUS_NOT_ACCEPTED) {
|
||||||
|
// Filetransfers not actively sending, nothing to do
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// If the file transfer is complete, we request a chunk of size 0.
|
// If the file transfer is complete, we request a chunk of size 0.
|
||||||
if (ft->status == FILESTATUS_FINISHED && friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) {
|
if (ft->status == FILESTATUS_FINISHED && friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) {
|
||||||
if (m->file_reqchunk) {
|
if (m->file_reqchunk) {
|
||||||
|
@ -1483,9 +1480,7 @@ static bool do_all_filetransfers(Messenger *m, int32_t friendnumber, void *userd
|
||||||
// Now it's inactive, we're no longer sending this.
|
// Now it's inactive, we're no longer sending this.
|
||||||
ft->status = FILESTATUS_NONE;
|
ft->status = FILESTATUS_NONE;
|
||||||
--friendcon->num_sending_files;
|
--friendcon->num_sending_files;
|
||||||
}
|
} else if (ft->status == FILESTATUS_TRANSFERRING && ft->paused == FILE_PAUSE_NOT) {
|
||||||
|
|
||||||
if (ft->status == FILESTATUS_TRANSFERRING && ft->paused == FILE_PAUSE_NOT) {
|
|
||||||
if (ft->size == 0) {
|
if (ft->size == 0) {
|
||||||
/* Send 0 data to friend if file is 0 length. */
|
/* Send 0 data to friend if file is 0 length. */
|
||||||
file_data(m, friendnumber, i, 0, nullptr, 0);
|
file_data(m, friendnumber, i, 0, nullptr, 0);
|
||||||
|
@ -1508,6 +1503,14 @@ static bool do_all_filetransfers(Messenger *m, int32_t friendnumber, void *userd
|
||||||
// The allocated slot is no longer free.
|
// The allocated slot is no longer free.
|
||||||
--*free_slots;
|
--*free_slots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Must be last to allow finishing file transfers
|
||||||
|
if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id(
|
||||||
|
m->fr_c, friendcon->friendcon_id))) {
|
||||||
|
LOGGER_TRACE(m->log, "Maximum connection speed reached");
|
||||||
|
// connection doesn't support any more data
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1614,6 +1617,7 @@ static int handle_filecontrol(Messenger *m, int32_t friendnumber, uint8_t receiv
|
||||||
case FILECONTROL_ACCEPT: {
|
case FILECONTROL_ACCEPT: {
|
||||||
if (receive_send && ft->status == FILESTATUS_NOT_ACCEPTED) {
|
if (receive_send && ft->status == FILESTATUS_NOT_ACCEPTED) {
|
||||||
ft->status = FILESTATUS_TRANSFERRING;
|
ft->status = FILESTATUS_TRANSFERRING;
|
||||||
|
++m->friendlist[friendnumber].num_sending_files;
|
||||||
} else {
|
} else {
|
||||||
if (ft->paused & FILE_PAUSE_OTHER) {
|
if (ft->paused & FILE_PAUSE_OTHER) {
|
||||||
ft->paused ^= FILE_PAUSE_OTHER;
|
ft->paused ^= FILE_PAUSE_OTHER;
|
||||||
|
@ -1652,12 +1656,12 @@ static int handle_filecontrol(Messenger *m, int32_t friendnumber, uint8_t receiv
|
||||||
m->file_filecontrol(m, friendnumber, real_filenumber, control_type, userdata);
|
m->file_filecontrol(m, friendnumber, real_filenumber, control_type, userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
ft->status = FILESTATUS_NONE;
|
if (receive_send && (ft->status == FILESTATUS_TRANSFERRING || ft->status == FILESTATUS_FINISHED)) {
|
||||||
|
|
||||||
if (receive_send) {
|
|
||||||
--m->friendlist[friendnumber].num_sending_files;
|
--m->friendlist[friendnumber].num_sending_files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ft->status = FILESTATUS_NONE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user