[phobos] phobos commit, revision 1560

Adam Ruppe destructionator at gmail.com
Thu May 27 05:39:22 PDT 2010


I remember seeing what looked like a bug in remove() when working on
the Windows port of rdmd. I don't know if it is related to what you
just changed.

I think I got the problem figured out, but I never committed a fix.

First, create a file and remove it. Should be no exception, worked
last time I saw it.

Next, create a file, open it in another process (I used a directory
and cmd.exe), then remove it. Now, this is where I saw it throw an
exception saying "success". I figure the problem was that the Windows
function returned something saying "file in use, but delete is queued
up", which enforce saw as an error, but GetLastError called success.

Probably a different bug than what you looked at, but maybe not.

On 5/27/10, Shin Fujishiro <rsinfu at gmail.com> wrote:
> Brad Roberts <braddr at puremagic.com> wrote:
>> On 5/26/2010 7:21 AM, dsource.org wrote:
>> > phobos commit, revision 1560
>> >
>> >
>> > user: rsinfu
>> >
>> > msg:
>> > Fixed bugzilla 4188: std.file.remove throws Exception on success.
>> >
>> > cenforce() used getErrno(), not GetLastError(), for errors happened in
>> > Win32 API.
>> >
>> > http://www.dsource.org/projects/phobos/changeset/1560
>>
>> This change seems wrong.
>>
>> Is there a use of cenforce that's wrong?  Does the inclusion of getErrno
>> need to
>> be conditional on something?
>>
>> Pure removal of the call to getErrno removes important error text that's
>> useful
>> in many contexts.
>>
>> - Brad
>
> It's correct.  getErrno (GetLastError) is automatically called as a
> default argument.
>
> Let's look inside the fixed cenforce():
> --------------------
> private T cenforce(T, string file = __FILE__, uint line = __LINE__)
> (T condition, lazy const(char)[] name)
> {
>     if (!condition)
>     {
>         throw new FileException(
>             text("In ", file, "(", line, "), data file ", name));
>     }
>     return condition;
> }
> --------------------
> It throws FileException with a single string argument.  The called
> constructor is this:
> --------------------
> class FileException : Exception
> {
>     ...
>     version(Windows) this(string name, uint errno = GetLastError)
>     {
>         this(name, sysErrorString(errno));
>         this.errno = errno;
>     }
>     version(Posix) this(in char[] name, uint errno = .getErrno)
>     {
>         auto s = strerror(errno);
>         this(name, to!string(s));
>         this.errno = errno;
>     }
> }
> --------------------
> Note the default argument.  It utilizes appropriate error number on the
> compiled platform, and the constructor converts it to error message.
> So, the pure removal of getErrno works.  Or rather, passing getErrno()
> is definitely wrong on Windows.
>
> Actually, FileExceptions are thrown in this way in other places of
> std/file.d.  For example:
> --------------------
> version(Windows) void rename(in char[] from, in char[] to)
> {
>     enforce(useWfuncs
>             ? MoveFileW(std.utf.toUTF16z(from), std.utf.toUTF16z(to))
>             : MoveFileA(toMBSz(from), toMBSz(to)),
>             new FileException(
>                 text("Attempting to rename file ", from, " to ",
>                         to)));
> }
> --------------------
>
> I verified it, tested the code on Posix and Win32.  I got correct
> message on error.  Then I commited the code to the repository.
>
> I'm sorry if my commit message caused you to misunderstand.  The commit
> message might be too short; I should have explained these things in the
> commit message.
>
>
> Shin
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos
>


More information about the phobos mailing list