Date: Fri, 2 Mar 2001 08:44:58 -0500 (EST) From: Peter Dufault <dufault@hda.hda.com> To: Dag-Erling Smorgrav <des@ofug.org> Cc: Anton Berezin <tobez@tobez.org>, hackers@FreeBSD.ORG Subject: Re: how to actually find out whether data hit the disk? Message-ID: <200103021344.f22Diw636709@hda.hda.com> In-Reply-To: <xzpvgpsmimh.fsf@flood.ping.uio.no> from Dag-Erling Smorgrav at "Mar 2, 2001 01:59:34 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
--ELM983540698-36466-0_ Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit > Peter Dufault <dufault@hda.hda.com> writes: > > > > Do an msync with MS_SYNC someplace. Also, use MAP_NOSYNC in > > > > mmap until 4.3 when Matt Dillon plans to make that the default behavior. > > > Ahh, no. That's the other way around - I do not *want* it to hit the > > > disk, but would like to *know* when it nevertheless does. > > OK, doing a stat and checking the mtime should give you > > the info at the expense of polling, I can't think of another way. > > Won't help. You'll get the same mtime no matter whether the file is > actually written to disk or not. No, the spec says: If there was no such call [to msync] these fields [st_ctime and st_mtime] may be marked for update at any time after a write reference if the underlying file is modified as a result. I wrote a program (attached) to verify it. Here's the output: > mapped at 08:34:04.206204 modification time 08:34:04.000000000 > modified at 08:34:05.210740 modification time 08:34:04.000000000 > unmapped at 08:34:06.220744 modification time 08:34:04.000000000 > remapped at 08:34:07.230750 modification time 08:34:04.000000000 > msync at 08:34:08.247007 modification time 08:34:08.000000000 Peter -- Peter Dufault (dufault@hda.com) Realtime development, Machine control, HD Associates, Inc. Fail-Safe systems, Agency approval --ELM983540698-36466-0_ Content-Type: text/plain; charset=US-ASCII Content-Disposition: attachment; filename=main.c Content-Description: /tmp/main.c Content-Transfer-Encoding: 7bit #include <unistd.h> #include <sys/mman.h> #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #ifndef MAP_NOSYNC #define MAP_NOSYNC 0 #endif static const char *name = "mapped_file"; static void put_tv(FILE *f, struct timeval *pTv) { struct tm tm; struct timeval tv; if (pTv == 0) { gettimeofday(&tv, 0); pTv = &tv; } localtime_r(&pTv->tv_sec, &tm); fprintf(f, "%02d:%02d:%02d.%06ld", tm.tm_hour, tm.tm_min, tm.tm_sec, pTv->tv_usec); } static void put_ts(FILE *f, struct timespec *pTs) { struct tm tm; localtime_r(&pTs->tv_sec, &tm); fprintf(f, "%02d:%02d:%02d.%09ld", tm.tm_hour, tm.tm_min, tm.tm_sec, pTs->tv_nsec); } static void quit_if(long code, long value, const char *s) { if (code == value) { perror(s); exit(1); } } static void status(FILE *f, const char *p, const int fd) { struct stat st; fstat(fd, &st); fprintf(f, "%12s ", p); put_tv(f, 0); fprintf(f, " modification time "); put_ts(f, &st.st_mtimespec); putchar('\n'); } int main(int ac, char *av[]) { void *p; long pagesize; int i, fd; void *buff; pagesize = sysconf(_SC_PAGESIZE); (void)unlink(name); errno = 0; quit_if((fd = open(name, O_RDWR|O_CREAT, 0666)), -1, "open"); buff = calloc(1, pagesize); quit_if((long)(p = mmap(0, 10*pagesize, PROT_READ|PROT_WRITE, MAP_NOSYNC|MAP_SHARED, fd, (off_t)0)), (long)MAP_FAILED, "mmap"); for (i = 0; i < 10; i++) { write(fd, buff, pagesize); } status(stdout, "mapped at", fd); sleep(1); *(long *)p = -1; status(stdout, "modified at", fd); sleep(1); munmap(p, 10*pagesize); status(stdout, "unmapped at", fd); sleep(1); quit_if((long)(p = mmap(0, 10*pagesize, PROT_READ|PROT_WRITE, MAP_NOSYNC|MAP_SHARED, fd, (off_t)0)), (long)MAP_FAILED, "mmap"); status(stdout, "remapped at", fd); sleep(1); quit_if(msync(p, 10*pagesize, MS_SYNC), -1, "msync"); status(stdout, "msync at", fd); close(fd); return 0; } --ELM983540698-36466-0_-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103021344.f22Diw636709>