This is the mail archive of the
cygwin-developers@cygwin.com
mailing list for the Cygwin project.
stat() whacks st_atime
- To: Cygwin-Developers <cygwin-developers at sources dot redhat dot com>
- Subject: stat() whacks st_atime
- From: Jason Tishler <jason at tishler dot net>
- Date: Thu, 26 Jul 2001 10:40:27 -0400
- Organization: Dot Hill Systems Corp.
I'm trying to track down why st_atime gets "whacked" when calling
stat(). By "whacked," I mean set to the current time (or thereabouts).
The attached program, stest.c, demonstrates the problem. If one calls
it repeatedly, then the specified file's st_atime keeps changing.
I've tracked down the problem to the following (in fhandler.cc):
int
fhandler_base::close (void)
{
int res = -1;
syscall_printf ("handle %p", get_handle());
[1] if (CloseHandle (get_handle()))
[2] res = 0;
...
}
The st_atime is actually not affected directly by stat() and if stest is
stopped at [1] above, then the file's st_atime value is still unchanged
(as verified by a Win32 program). If gdb continues to [2], then the
file's st_atime has been changed.
Unfortunately, I cannot figure out what is affecting the change. Is
there a Cygwin background thread that wakes up when the handle is
closed and somehow affects the file's st_atime? Or, can CloseHandle()
itself somehow be the culprit. I'm really perplexed.
Does anyone understand what is going on?
BTW, this issue prevents mutt from detecting new mail in mbox folders.
I was able to temporarily workaround this issue by reconfiguring with
"--enable-buffy-size".
Thanks,
Jason
--
Jason Tishler
Director, Software Engineering Phone: 732.264.8770 x235
Dot Hill Systems Corp. Fax: 732.264.8798
82 Bethany Road, Suite 7 Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA WWW: http://www.dothill.com
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
int
main(int argc, char* argv[])
{
struct stat buf;
time_t now;
now = time(0);
printf("now = %s", ctime(&now));
stat(argv[1], &buf);
printf("access time = %s", ctime(&buf.st_atime));
printf("modify time = %s", ctime(&buf.st_mtime));
}