Bug 1055966 - Specify limitation of RemoteOpenFileChild::OpenNSPRFileDesc().
☠☠ backed out by 71cbfd25a307 ☠ ☠
authorShian-Yow Wu <swu@mozilla.com>
Thu, 21 Aug 2014 09:40:19 +0800
changeset 200740 69471d6c631a716ba07c8b65846e23451ed570c4
parent 200739 36ed12777929c5fdbdae8bb5c5e59d9a1e36698a
child 200741 cc61b5bc547586312edd2e85bc5bb1d2c4ed129c
push id27353
push useremorley@mozilla.com
push dateThu, 21 Aug 2014 12:33:28 +0000
treeherdermozilla-central@479ec85d9e6f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1055966
milestone34.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1055966 - Specify limitation of RemoteOpenFileChild::OpenNSPRFileDesc().
modules/libjar/nsIJARChannel.idl
netwerk/ipc/RemoteOpenFileChild.h
--- a/modules/libjar/nsIJARChannel.idl
+++ b/modules/libjar/nsIJARChannel.idl
@@ -34,11 +34,18 @@ interface nsIJARChannel : nsIChannel
      * This will work even without opening the channel.
      */
     readonly attribute nsIZipEntry zipEntry;
 
     /**
      * For child process, set this to make sure that a valid file descriptor of
      * JAR file is always provided when calling NSPRFileDesc().
      * Must be set before Open() or AsyncOpen() to be effective.
+     *
+     * Note that the file descriptor returned by NSPRFileDesc() is duplicated
+     * from the original, which shares its file offset with the original.  If
+     * the file offset is modified (ex: by lseek/read/write) on one of the
+     * shared descriptors, the offset is also changed for the other.
+     * It can be safely used only with operations that take absolute offsets,
+     * such as mmap/pread/pwrite.
      */
     void ensureChildFd();
 };
--- a/netwerk/ipc/RemoteOpenFileChild.h
+++ b/netwerk/ipc/RemoteOpenFileChild.h
@@ -27,23 +27,25 @@ namespace net {
 /**
  * RemoteOpenFileChild: a thin wrapper around regular nsIFile classes that does
  * IPC to open a file handle on parent instead of child.  Used when we can't
  * open file handle on child (don't have permission), but we don't want the
  * overhead of shipping all I/O traffic across IPDL.  Example: JAR files.
  *
  * To open a file handle with this class, AsyncRemoteFileOpen() must be called
  * first.  After the listener's OnRemoteFileOpenComplete() is called, if the
- * result is NS_OK, nsIFile.OpenNSPRFileDesc() may be called--once--to get the
- * file handle.
+ * result is NS_OK, nsIFile.OpenNSPRFileDesc() may be called to get a
+ * duplicated file descriptor.
  *
- * Note that calling Clone() on this class results in the filehandle ownership
- * being passed on to the new RemoteOpenFileChild. I.e. if
- * OnRemoteFileOpenComplete is called and then Clone(), OpenNSPRFileDesc() will
- * work in the cloned object, but not in the original.
+ * Note that the file descriptor returned by NSPRFileDesc() is duplicated from
+ * the original, which shares its file offset with the original.  If the file
+ * offset is modified (ex: by lseek/read/write) on one of the shared
+ * descriptors, the offset is also changed for the other.   It can be safely
+ * used only with operations that take absolute offsets, such as
+ * mmap/pread/pwrite.
  *
  * This class should only be instantiated in a child process.
  *
  */
 class RemoteOpenFileChild MOZ_FINAL
   : public PRemoteOpenFileChild
   , public nsIFile
   , public nsIHashable