diff options
-rw-r--r-- | pr/include/md/_unixos.h | 6 | ||||
-rw-r--r-- | pr/include/md/_win95.h | 6 | ||||
-rw-r--r-- | pr/include/md/_winnt.h | 6 | ||||
-rw-r--r-- | pr/include/prio.h | 9 | ||||
-rw-r--r-- | pr/include/private/primpl.h | 6 | ||||
-rw-r--r-- | pr/src/io/prmmap.c | 8 | ||||
-rw-r--r-- | pr/src/md/unix/unix.c | 17 | ||||
-rw-r--r-- | pr/src/md/windows/ntmisc.c | 17 | ||||
-rw-r--r-- | pr/src/nspr.def | 1 |
9 files changed, 76 insertions, 0 deletions
diff --git a/pr/include/md/_unixos.h b/pr/include/md/_unixos.h index 798d0b33..04d99041 100644 --- a/pr/include/md/_unixos.h +++ b/pr/include/md/_unixos.h @@ -493,6 +493,12 @@ extern PRStatus _MD_MemUnmap(void *addr, PRUint32 size); extern PRStatus _MD_CloseFileMap(struct PRFileMap *fmap); #define _MD_CLOSE_FILE_MAP _MD_CloseFileMap +extern PRStatus _MD_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len); +#define _MD_SYNC_MEM_MAP _MD_SyncMemMap + /* * The standard (XPG4) gettimeofday() (from BSD) takes two arguments. * On some SVR4 derivatives, gettimeofday() takes only one argument. diff --git a/pr/include/md/_win95.h b/pr/include/md/_win95.h index b008c132..d65e2643 100644 --- a/pr/include/md/_win95.h +++ b/pr/include/md/_win95.h @@ -527,6 +527,12 @@ extern PRStatus _MD_MemUnmap(void *addr, PRUint32 size); extern PRStatus _MD_CloseFileMap(struct PRFileMap *fmap); #define _MD_CLOSE_FILE_MAP _MD_CloseFileMap +extern PRStatus _MD_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len); +#define _MD_SYNC_MEM_MAP _MD_SyncMemMap + /* --- Named semaphores stuff --- */ #define _PR_HAVE_NAMED_SEMAPHORES #define _MD_OPEN_SEMAPHORE _PR_MD_OPEN_SEMAPHORE diff --git a/pr/include/md/_winnt.h b/pr/include/md/_winnt.h index 4d4d2c12..7e5477fd 100644 --- a/pr/include/md/_winnt.h +++ b/pr/include/md/_winnt.h @@ -582,6 +582,12 @@ extern PRStatus _MD_MemUnmap(void *addr, PRUint32 size); extern PRStatus _MD_CloseFileMap(struct PRFileMap *fmap); #define _MD_CLOSE_FILE_MAP _MD_CloseFileMap +extern PRStatus _MD_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len); +#define _MD_SYNC_MEM_MAP _MD_SyncMemMap + /* --- Named semaphores stuff --- */ #define _PR_HAVE_NAMED_SEMAPHORES #define _MD_OPEN_SEMAPHORE _PR_MD_OPEN_SEMAPHORE diff --git a/pr/include/prio.h b/pr/include/prio.h index ac4b270d..afea88e9 100644 --- a/pr/include/prio.h +++ b/pr/include/prio.h @@ -1855,6 +1855,15 @@ NSPR_API(PRStatus) PR_MemUnmap(void *addr, PRUint32 len); NSPR_API(PRStatus) PR_CloseFileMap(PRFileMap *fmap); /* + * Synchronously flush the given memory-mapped address range of the given open + * file to disk. + */ +NSPR_API(PRStatus) PR_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len); + +/* ****************************************************************** * * Interprocess communication diff --git a/pr/include/private/primpl.h b/pr/include/private/primpl.h index 5b5469c4..249f6caa 100644 --- a/pr/include/private/primpl.h +++ b/pr/include/private/primpl.h @@ -1974,6 +1974,12 @@ extern PRStatus _PR_MD_MEM_UNMAP(void *addr, PRUint32 size); extern PRStatus _PR_MD_CLOSE_FILE_MAP(PRFileMap *fmap); #define _PR_MD_CLOSE_FILE_MAP _MD_CLOSE_FILE_MAP +extern PRStatus _PR_MD_SYNC_MEM_MAP( + PRFileDesc *fd, + void *addr, + PRUint32 len); +#define _PR_MD_SYNC_MEM_MAP _MD_SYNC_MEM_MAP + /* Named Shared Memory */ /* diff --git a/pr/src/io/prmmap.c b/pr/src/io/prmmap.c index d22ba399..6ffc1330 100644 --- a/pr/src/io/prmmap.c +++ b/pr/src/io/prmmap.c @@ -59,3 +59,11 @@ PR_IMPLEMENT(PRStatus) PR_CloseFileMap(PRFileMap *fmap) { return _PR_MD_CLOSE_FILE_MAP(fmap); } + +PR_IMPLEMENT(PRStatus) PR_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len) +{ + return _PR_MD_SYNC_MEM_MAP(fd, addr, len); +} diff --git a/pr/src/md/unix/unix.c b/pr/src/md/unix/unix.c index 02962e67..a3445a5f 100644 --- a/pr/src/md/unix/unix.c +++ b/pr/src/md/unix/unix.c @@ -3638,6 +3638,23 @@ PRStatus _MD_CloseFileMap(PRFileMap *fmap) return PR_SUCCESS; } +PRStatus _MD_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len) +{ + if (msync(addr, len, MS_SYNC) == 0) { + return PR_SUCCESS; + } else { + if (errno == EINVAL) { + PR_SetError(PR_INVALID_ARGUMENT_ERROR, errno); + } else { + PR_SetError(PR_UNKNOWN_ERROR, errno); + } + return PR_FAILURE; + } +} + #if defined(_PR_NEED_FAKE_POLL) /* diff --git a/pr/src/md/windows/ntmisc.c b/pr/src/md/windows/ntmisc.c index e23f6725..7bd40b55 100644 --- a/pr/src/md/windows/ntmisc.c +++ b/pr/src/md/windows/ntmisc.c @@ -995,6 +995,23 @@ PRStatus _MD_CloseFileMap(PRFileMap *fmap) return PR_SUCCESS; } +PRStatus _MD_SyncMemMap( + PRFileDesc *fd, + void *addr, + PRUint32 len) +{ + PROsfd osfd; + + osfd = ( fd == (PRFileDesc*)-1 )? -1 : fd->secret->md.osfd; + + if (FlushViewOfFile(addr, len) && FlushFileBuffers((HANDLE) osfd)) { + return PR_SUCCESS; + } else { + PR_SetError(PR_UNKNOWN_ERROR, GetLastError()); + return PR_FAILURE; + } +} + /* *********************************************************************** * diff --git a/pr/src/nspr.def b/pr/src/nspr.def index 7777a3db..1639b97e 100644 --- a/pr/src/nspr.def +++ b/pr/src/nspr.def @@ -229,6 +229,7 @@ EXPORTS ;- PR_Malloc; PR_MemMap; PR_MemUnmap; + PR_SyncMemMap; PR_MicrosecondsToInterval; PR_MillisecondsToInterval; PR_LockOrderedLock; |