Eolite 3.85: copy files with size bigger than free ram, fix hang and memory leak when copy

git-svn-id: svn://kolibrios.org@7210 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2018-03-26 14:31:26 +00:00
parent bddfb2f439
commit f3a69d6d86
6 changed files with 77 additions and 41 deletions

View File

@ -296,7 +296,6 @@ void TWebBrowser::SetStyle() {
} }
if (opened) { if (opened) {
if (strcmp(#header, #version) != 0) { if (strcmp(#header, #version) != 0) {
debugln("!!!!!!!!!!!!!!!!!!!!!!");
ChangeCharset(charsets[cur_encoding], "CP866", #header); ChangeCharset(charsets[cur_encoding], "CP866", #header);
sprintf(#header, "%s - %s", #header, #version); sprintf(#header, "%s - %s", #header, #version);
} }

View File

@ -57,6 +57,7 @@ void Copy(dword pcth, char cut)
} }
void Paste() { void Paste() {
copy_stak = free(copy_stak);
copy_stak = malloc(64000); copy_stak = malloc(64000);
CreateThread(#PasteThread,copy_stak+64000-4); CreateThread(#PasteThread,copy_stak+64000-4);
} }

View File

@ -33,9 +33,9 @@
?define T_CD "CD-ROM " ?define T_CD "CD-ROM "
?define T_FD "Floppy disk " ?define T_FD "Floppy disk "
?define T_HD "Hard disk " ?define T_HD "Hard disk "
?define T_SATA "SATA disk" ?define T_SATA "SATA disk "
?define T_USB "USB disk" ?define T_USB "USB disk "
?define T_RAM "RAM disk" ?define T_RAM "RAM disk "
#endif #endif
struct _SystemDiscs struct _SystemDiscs

View File

@ -1,5 +1,5 @@
#define TITLE "Eolite File Manager v3.83" #define TITLE "Eolite File Manager v3.85"
#define ABOUT_TITLE "EOLITE 3.83" #define ABOUT_TITLE "EOLITE 3.85"
#ifdef LANG_RUS #ifdef LANG_RUS
?define T_FILE "” ©«" ?define T_FILE "” ©«"

View File

@ -14,9 +14,7 @@
if (!from1) || (!in1) if (!from1) || (!in1)
{ {
notify("Error: too less copyf params!"); notify("Error: too few copyf() params!");
notify(from1);
notify(in1);
return; return;
} }
if (error = GetFileInfo(from1, #CopyFile_atr1)) if (error = GetFileInfo(from1, #CopyFile_atr1))
@ -28,7 +26,7 @@
return CopyFolder(from1, in1); return CopyFolder(from1, in1);
else else
{ {
Operation_Draw_Progress(from1+strchr(from1, '/')); Operation_Draw_Progress(from1+strrchr(from1, '/'));
return CopyFile(from1, in1); return CopyFile(from1, in1);
} }
} }
@ -37,27 +35,24 @@
{ {
BDVK CopyFile_atr; BDVK CopyFile_atr;
dword error, cbuf; dword error, cbuf;
dword block;
if (error = GetFileInfo(copy_from3, #CopyFile_atr)) if (error = GetFileInfo(copy_from3, #CopyFile_atr))
{ {
debugln("Error: CopyFile->GetFileInfo"); debugln("Error: CopyFile->GetFileInfo");
} }
else if (GetFreeRAM()-1024*1024 < CopyFile_atr.sizelo) //GetFreeRam-1Mb and convert to bytes
{
debugln("Error: CopyFile->File size is bigger than RAM avilable");
error = 30;
}
else {
cbuf = malloc(CopyFile_atr.sizelo);
if (error = ReadFile(0, CopyFile_atr.sizelo, cbuf, copy_from3))
{
debugln("Error: CopyFile->ReadFile");
}
else else
{ {
if (error = WriteFile(CopyFile_atr.sizelo, cbuf, copy_in3)) debugln("Error: CopyFile->WriteFile"); if (GetFreeRAM()-1024*1024 < CopyFile_atr.sizelo) //GetFreeRam-1Mb and convert to bytes
{
if (error = CopyFileByBlocks(CopyFile_atr.sizelo, copy_from3, copy_in3))
debugln("Error: CopyFile->CopyFileByBlocks");
}
else {
if (error = CopyFileAtOnce(CopyFile_atr.sizelo, copy_from3, copy_in3))
debugln("Error: CopyFile->CopyFileAtOnce");
} }
} }
free(cbuf);
if (error) debug_error(copy_from3, error); if (error) debug_error(copy_from3, error);
return error; return error;
} }
@ -96,7 +91,7 @@
} }
else else
{ {
Operation_Draw_Progress(filename+strchr(filename, '/')); Operation_Draw_Progress(filename+strrchr(filename, '/'));
if (error=CopyFile(#copy_from2, #copy_in2)) if (error=CopyFile(#copy_from2, #copy_in2))
{ {
if (fabs(error)==8) { debugln("Stop copying."); break;} //TODO: may be need grobal var like stop_all if (fabs(error)==8) { debugln("Stop copying."); break;} //TODO: may be need grobal var like stop_all

View File

@ -129,33 +129,30 @@
// Ïðî÷èòàòü ôàéë // // Ïðî÷èòàòü ôàéë //
//////////////////////////// ////////////////////////////
:f70 read_file_70; :f70 read_file_70;
:int ReadFile(dword read_pos, read_file_size, read_buffer, read_file_path) :int ReadFile(dword offset, data_size, buffer, file_path)
{ {
read_file_70.func = 0; read_file_70.func = 0;
read_file_70.param1 = read_pos; read_file_70.param1 = offset;
read_file_70.param2 = 0; read_file_70.param2 = 0;
read_file_70.param3 = read_file_size; read_file_70.param3 = data_size;
read_file_70.param4 = read_buffer; read_file_70.param4 = buffer;
read_file_70.rezerv = 0; read_file_70.rezerv = 0;
read_file_70.name = read_file_path; read_file_70.name = file_path;
$mov eax,70 $mov eax,70
$mov ebx,#read_file_70.func $mov ebx,#read_file_70.func
$int 0x40 $int 0x40
} }
///////////////////////////
// Çàïèñàòü ôàéë //
///////////////////////////
:f70 write_file_70; :f70 write_file_70;
:int WriteFile(dword write_file_size, write_buffer, write_file_path) :int WriteFile(dword data_size, buffer, file_path)
{ {
write_file_70.func = 2; write_file_70.func = 2;
write_file_70.param1 = 0; write_file_70.param1 = 0;
write_file_70.param2 = 0; write_file_70.param2 = 0;
write_file_70.param3 = write_file_size; write_file_70.param3 = data_size;
write_file_70.param4 = write_buffer; write_file_70.param4 = buffer;
write_file_70.rezerv = 0; write_file_70.rezerv = 0;
write_file_70.name = write_file_path; write_file_70.name = file_path;
$mov eax,70 $mov eax,70
$mov ebx,#write_file_70.func $mov ebx,#write_file_70.func
$int 0x40 $int 0x40
@ -165,20 +162,21 @@
// WriteInFileThatAlredyExists // // WriteInFileThatAlredyExists //
//////////////////////////////////////// ////////////////////////////////////////
:f70 write_file_offset_70; :f70 write_file_offset_70;
:int WriteFileWithOffset(dword write_data_size, write_buffer, write_file_path, offset) :int WriteFileWithOffset(dword offset, data_size, buffer, file_path)
{ {
write_file_offset_70.func = 3; write_file_offset_70.func = 3;
write_file_offset_70.param1 = offset; write_file_offset_70.param1 = offset;
write_file_offset_70.param2 = 0; write_file_offset_70.param2 = 0;
write_file_offset_70.param3 = write_data_size; write_file_offset_70.param3 = data_size;
write_file_offset_70.param4 = write_buffer; write_file_offset_70.param4 = buffer;
write_file_offset_70.rezerv = 0; write_file_offset_70.rezerv = 0;
write_file_offset_70.name = write_file_path; write_file_offset_70.name = file_path;
$mov eax,70 $mov eax,70
$mov ebx,#write_file_offset_70.func $mov ebx,#write_file_offset_70.func
$int 0x40 $int 0x40
} }
/////////////////////////// ///////////////////////////
// Ïðî÷èòàòü ïàïêó // // Ïðî÷èòàòü ïàïêó //
/////////////////////////// ///////////////////////////
@ -346,4 +344,47 @@ enum
return #size; return #size;
} }
:int CopyFileAtOnce(dword size, copyFrom, copyTo)
dword cbuf;
int error;
{
cbuf = malloc(size);
if (error = ReadFile(0, size, cbuf, copyFrom))
{
debugln("Error: CopyFileAtOnce->ReadFile");
}
else
{
if (error = WriteFile(size, cbuf, copyTo)) debugln("Error: CopyFileAtOnce->WriteFile");
}
free(cbuf);
return error;
}
:int CopyFileByBlocks(dword size, copyFrom, copyTo)
dword cbuf;
int error=-1;
dword offpos=0;
int block_size=1024*4024; //copy by 4 MiBs
{
cbuf = malloc(block_size);
WriteFile(0, 0, copyTo); //create file
while(offpos < size)
{
error = ReadFile(offpos, block_size, cbuf, copyFrom);
if (error = 6) { //File ended before last byte was readed
block_size = EBX;
error=0;
}
else
if (error!=0) break;
if (error = WriteFileWithOffset(offpos, block_size, cbuf, copyTo)) break;
offpos += block_size;
}
free(cbuf);
return error;
}
#endif #endif