Cygwin Performance and stat()

Christian Franke Christian.Franke@t-online.de
Sun May 30 23:00:00 GMT 2010


Christopher Faylor wrote:
> On Sun, May 30, 2010 at 12:51:31PM -0700, Christopher Wingert wrote:
>    
>> I assume POSIX compatibility.  However, I bet there are cases where one
>> can sacrifice compatibility for performance (configurable with an
>> environment flag of course).
>>
>>      

The problem is that POSIX stat() requires to provide all information in 
struct stat. This is expensive: convert ACL into mode, convert filetimes 
into time_t, lookup uids, invent ino, ....
Typically applications don't need all info but there is no way to tell 
this to stat().


>> See
>>
>> http://marc.info/?l=git&m=122278284210941
>>
>> for an example.
>>      
> Yes, I got what you meant.  I think that bypassing Cygwin, assuming you
> can do something good enough is a remarkably bad idea.
>
>    

A probably better idea would be to add another stat() variant (this is 
IMO missing in POSIX) to Cygwin which allows to specify which info is 
needed.

Something like:

enum {
   CYGSTAT_MODE = 0x01,
   CYGSTAT_INO = 0x02,
   CYGSTAT_SIZE = 0x04,
   CYGSTAT_ATIME = 0x08,
   ...
};

int cygwin_stat4(const char *path, struct stat *buf, unsigned needed, 
unsigned *pvalid);

Where 'needed' contains all CYGSTAT_* flags for the stat fields needed. 
If 'pvalid' is != 0, the flags for the valid fields are returned in the 
variable. This can be a superset of 'needed' if some info is available 
for free.

Usage example:

// Get st_size only.
#ifdef __CYGWIN__
#define stat_size(p, b) cygwin_stat4(p, b, CYGSTAT_SIZE, NULL)
#else
#define stat_size(p, b) stat(p, b)
#endif

Christian


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list