summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pr/include/md/_unixos.h6
-rw-r--r--pr/include/md/_win95.h6
-rw-r--r--pr/include/md/_winnt.h6
-rw-r--r--pr/include/prio.h9
-rw-r--r--pr/include/private/primpl.h6
-rw-r--r--pr/src/io/prmmap.c8
-rw-r--r--pr/src/md/unix/unix.c17
-rw-r--r--pr/src/md/windows/ntmisc.c17
-rw-r--r--pr/src/nspr.def1
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;