[poppler] UniqueFileStream and deleted files
Albert Astals Cid
aacid at kde.org
Mon Mar 25 12:05:38 PDT 2013
El Dilluns, 25 de març de 2013, a les 16:41:35, Adam Reichold va escriure:
> Hello,
>
> Am 25.03.2013 08:44, schrieb Thomas Freitag:
> > Am 25.03.2013 00:51, schrieb Albert Astals Cid:
> >> El Diumenge, 24 de març de 2013, a les 16:31:05, Adam Reichold va
> >>
> >> escriure:
> >>> Hello,
> >>>
> >>> Am 24.03.2013 06:32, schrieb Thomas Freitag:
> >>>> Am 23.03.2013 20:08, schrieb Albert Astals Cid:
> >>>>> El Dissabte, 23 de març de 2013, a les 20:01:58, Thomas Freitag va
> >>>>>
> >>>>> escriure:
> >>>>>> Am 23.03.2013 18:59, schrieb Ihar `Philips` Filipau:
> >>>>>>> On 3/23/13, Ihar `Philips` Filipau <thephilips at gmail.com> wrote:
> >>>>>>>>> (i tried to find a way to duplicate a FILE* but failed)
> >>>>>>>>
> >>>>>>>> How did you duplicate FILE*?
> >>>>>>>>
> >>>>>>>> How did the `fdopen( fileno(oldfile), mode )` failed?
> >>>>>>>
> >>>>>>> Nope. This is the right way:
> >>>>>>>
> >>>>>>> int new_fd = dup( fileno(oldfile) );
> >>>>>>> FILE *new_file = fdopen( new_fd, mode );
> >>>>>>
> >>>>>> Duplicating the FILE pointer in that way is not a solution: I
> >>>>>> tried it
> >>>>>> that way when I began to implement thread safe feature: At least
> >>>>>> under
> >>>>>> Ubuntu and gcc the duplicated file pointer uses the same underlying
> >>>>>> buffer, and that corrupts the thread safe feature.
> >>>>>
> >>>>> Exactly, it is the documented behaviour
> >>>>>
> >>>>> "They refer to the same open file description and thus share file
> >>>>> offset"
> >>>>>
> >>>>>> That's why I used the
> >>>>>> fileName to create a complete new file pointer.
> >>>>>> Of course we can do it in that way if we detect that the file is
> >>>>>> deleted
> >>>>>> (and only then!), but a program which use threads to render different
> >>>>>> pages the same time will then render garbage :-(
> >>>>>
> >>>>> No. We either write the file back to a temporary location as i
> >>>>> suggested in my
> >>>>> initial mail, or use the only fd with locking. I think i'm favoring
> >>>>> the second
> >>>>> use case since writing the file back might not even work if we run out
> >>>>> of free
> >>>>> space.
> >>>>
> >>>> I think, You're second solution is quite easy to implement (I mean
> >>>> really only easy to implement, it will take some time to change every
> >>>> code snippet and deeply test the changed code): since FileStream
> >>>> already
> >>>> use it's own buffer, there is no really need of the underlying system
> >>>> file buffer. So implementing something like a sharable GooFile (or
> >>>> extend gfile) which can be locked and remember the next read
> >>>> position in
> >>>> FileStream and then do something like gfile->read(readposition, buf,
> >>>> buflength) wouldn't really reduce the speed. But then I would prefer
> >>>> use
> >>>> the low level file handles instead of the file pointer. And it's even
> >>>> better than to write platform specific code and rely on Windows that
> >>>> the
> >>>> open file is not deletable and search for a Mac solution.
> >>>> Then the UniqueFileStream mechanism and the streamOwner instance
> >>>> variable can be removed, too.
> >>>> On the other hand: who deletes a just opened file and expects stability
> >>>> of the application which just opens the file? Is it really worth the
> >>>> effort?
> >>>
> >>> Seems I am a bit to the party, but for what it's worth: I asked myself
> >>> the same question as Thomas. Providing a file object that takes care of
> >>> looking and per-thread offset seems like the best solution (ideally
> >>> implementing using low-level I/O), but is it really that useful to be
> >>> able to continue rendering unlinked files as long as Poppler fails
> >>> gracefully, i.e. does not crash.
> >>
> >> We still have the file open, it should work.
> >
> > Ok, ok, I surrender. If You just post it to find a mug who will do it,
> > then open a bug report and assign it to me :-) Even if I don't feel like
> > to open an issue again which I just closed after working on it round
> > about 9 months, it is easier to make the mistakes by my own instead of
> > searching errors from others :-)
> > But I'm too busy in the moment with other projects to do it immediately,
> > so it will take probably a while.
> >
> > Cheers,
> > Thomas
>
> I would like to help implementing and testing this. Preferably under the
> advisement of Thomas. If he feels like that would actually help, that is.
All yours :-)
https://bugs.freedesktop.org/show_bug.cgi?id=62735
Cheers,
Albert
>
> Regards, Adam.
>
> >> Cheers,
> >>
> >> Albert
> >>>
> >>> Best regards, Adam.
> >>>
> >>>> Cheers,
> >>>> Thomas
> >>>>
> >>>>> Cheers,
> >>>>>
> >>>>> Albert
> >>>>>>
> >>>>>> Cheers,
> >>>>>> Thomas
> >>>>>>
> >>>>>>> It is OK to use *NIX function here - the dup() - since deleting open
> >>>>>>> file can happen only on the *NIX-like OS, Mac OS X included. Windows
> >>>>>>> doesn't allow that. Correct me if I'm wrong. Tested on Linux, HP-UX
> >>>>>>> and Solaris for the safety sake: the fclose() would close the
> >>>>>>> dup()ed
> >>>>>>> file descriptor.
> >>>>>>>
> >>>>>>> Though I'm not sure how to integrate that with the rest of the
> >>>>>>> portable
> >>>>>>> code. :)
> >>>>>>>
> >>>>>>> FYI.
> >>>>>>> _______________________________________________
> >>>>>>> poppler mailing list
> >>>>>>> poppler at lists.freedesktop.org
> >>>>>>> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>>>>>>
> >>>>>>> .
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> poppler mailing list
> >>>>>> poppler at lists.freedesktop.org
> >>>>>> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>>>>
> >>>>> _______________________________________________
> >>>>> poppler mailing list
> >>>>> poppler at lists.freedesktop.org
> >>>>> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>>>>
> >>>>> .
> >>>>
> >>>> _______________________________________________
> >>>> poppler mailing list
> >>>> poppler at lists.freedesktop.org
> >>>> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>>
> >>> _______________________________________________
> >>> poppler mailing list
> >>> poppler at lists.freedesktop.org
> >>> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>
> >> _______________________________________________
> >> poppler mailing list
> >> poppler at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/poppler
> >>
> >> .
> >
> > _______________________________________________
> > poppler mailing list
> > poppler at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/poppler
>
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler
More information about the poppler
mailing list