Cygwin: reduce size of fhandler_cygdrive
fhandler_cygdrive has a size of 696 bytes on x86_64, while the next biggest fhandler type, fhandler_pty_master, is 584 bytes. The members responsible for the size are private to opendir/readdir/closedir usage. fhandler_disk_file stores private readdir data in DIR->__d_internal instead. Use equivalent method with fhandler_cygdrive. This drops the size to 464 bytes. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
b995936ab5
commit
fbdae2c216
|
@ -1350,14 +1350,6 @@ public:
|
||||||
|
|
||||||
class fhandler_cygdrive: public fhandler_disk_file
|
class fhandler_cygdrive: public fhandler_disk_file
|
||||||
{
|
{
|
||||||
enum
|
|
||||||
{
|
|
||||||
DRVSZ = sizeof ("x:\\")
|
|
||||||
};
|
|
||||||
int ndrives;
|
|
||||||
const char *pdrive;
|
|
||||||
char pdrive_buf[1 + (2 * 26 * DRVSZ)];
|
|
||||||
void set_drives ();
|
|
||||||
public:
|
public:
|
||||||
fhandler_cygdrive ();
|
fhandler_cygdrive ();
|
||||||
int open (int flags, mode_t mode);
|
int open (int flags, mode_t mode);
|
||||||
|
|
|
@ -2362,7 +2362,7 @@ fhandler_disk_file::closedir (DIR *dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
fhandler_cygdrive::fhandler_cygdrive () :
|
fhandler_cygdrive::fhandler_cygdrive () :
|
||||||
fhandler_disk_file (), ndrives (0), pdrive (NULL)
|
fhandler_disk_file ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2383,13 +2383,6 @@ fhandler_cygdrive::open (int flags, mode_t mode)
|
||||||
return open_null (flags);
|
return open_null (flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
fhandler_cygdrive::set_drives ()
|
|
||||||
{
|
|
||||||
pdrive = pdrive_buf;
|
|
||||||
ndrives = GetLogicalDriveStrings (sizeof pdrive_buf, pdrive_buf) / DRVSZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_cygdrive::fstat (struct stat *buf)
|
fhandler_cygdrive::fstat (struct stat *buf)
|
||||||
{
|
{
|
||||||
|
@ -2412,14 +2405,28 @@ fhandler_cygdrive::fstatvfs (struct statvfs *sfs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_DRIVE_BUF_LEN (sizeof ("x:\\") * 26 + 2)
|
||||||
|
|
||||||
|
struct __DIR_drives
|
||||||
|
{
|
||||||
|
char *pdrive;
|
||||||
|
char pbuf[MAX_DRIVE_BUF_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define d_drives(d) ((__DIR_drives *) (d)->__d_internal)
|
||||||
|
|
||||||
DIR *
|
DIR *
|
||||||
fhandler_cygdrive::opendir (int fd)
|
fhandler_cygdrive::opendir (int fd)
|
||||||
{
|
{
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
|
|
||||||
dir = fhandler_disk_file::opendir (fd);
|
dir = fhandler_disk_file::opendir (fd);
|
||||||
if (dir && !ndrives)
|
if (dir)
|
||||||
set_drives ();
|
{
|
||||||
|
dir->__d_internal = (uintptr_t) new __DIR_drives;
|
||||||
|
GetLogicalDriveStrings (MAX_DRIVE_BUF_LEN, d_drives(dir)->pbuf);
|
||||||
|
d_drives(dir)->pdrive = d_drives(dir)->pbuf;
|
||||||
|
}
|
||||||
|
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
@ -2431,7 +2438,7 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (!pdrive || !*pdrive)
|
if (!d_drives(dir)->pdrive || !*d_drives(dir)->pdrive)
|
||||||
{
|
{
|
||||||
if (!(dir->__flags & dirent_saw_dot))
|
if (!(dir->__flags & dirent_saw_dot))
|
||||||
{
|
{
|
||||||
|
@ -2441,7 +2448,7 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
}
|
}
|
||||||
return ENMFILE;
|
return ENMFILE;
|
||||||
}
|
}
|
||||||
disk_type dt = get_disk_type ((drive[0] = *pdrive, drive));
|
disk_type dt = get_disk_type ((drive[0] = *d_drives(dir)->pdrive, drive));
|
||||||
if (dt == DT_SHARE_SMB)
|
if (dt == DT_SHARE_SMB)
|
||||||
{
|
{
|
||||||
/* Calling NetUseGetInfo on SMB drives allows to fetch the
|
/* Calling NetUseGetInfo on SMB drives allows to fetch the
|
||||||
|
@ -2463,16 +2470,16 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (dt != DT_FLOPPY
|
else if (dt != DT_FLOPPY
|
||||||
&& GetFileAttributes (pdrive) != INVALID_FILE_ATTRIBUTES)
|
&& GetFileAttributes (d_drives(dir)->pdrive) != INVALID_FILE_ATTRIBUTES)
|
||||||
break;
|
break;
|
||||||
pdrive = strchr (pdrive, '\0') + 1;
|
d_drives(dir)->pdrive = strchr (d_drives(dir)->pdrive, '\0') + 1;
|
||||||
}
|
}
|
||||||
*de->d_name = cyg_tolower (*pdrive);
|
*de->d_name = cyg_tolower (*d_drives(dir)->pdrive);
|
||||||
de->d_name[1] = '\0';
|
de->d_name[1] = '\0';
|
||||||
user_shared->warned_msdos = true;
|
user_shared->warned_msdos = true;
|
||||||
de->d_ino = readdir_get_ino (pdrive, false);
|
de->d_ino = readdir_get_ino (d_drives(dir)->pdrive, false);
|
||||||
dir->__d_position++;
|
dir->__d_position++;
|
||||||
pdrive = strchr (pdrive, '\0') + 1;
|
d_drives(dir)->pdrive = strchr (d_drives(dir)->pdrive, '\0') + 1;
|
||||||
syscall_printf ("%p = readdir (%p) (%s)", &de, dir, de->d_name);
|
syscall_printf ("%p = readdir (%p) (%s)", &de, dir, de->d_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2480,13 +2487,13 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
void
|
void
|
||||||
fhandler_cygdrive::rewinddir (DIR *dir)
|
fhandler_cygdrive::rewinddir (DIR *dir)
|
||||||
{
|
{
|
||||||
pdrive = pdrive_buf;
|
d_drives(dir)->pdrive = d_drives(dir)->pbuf;
|
||||||
dir->__d_position = 0;
|
dir->__d_position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fhandler_cygdrive::closedir (DIR *dir)
|
fhandler_cygdrive::closedir (DIR *dir)
|
||||||
{
|
{
|
||||||
pdrive = pdrive_buf;
|
delete d_drives(dir);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue