https://issues.dlang.org/show_bug.cgi?id=14868

--- Comment #5 from Sergei Degtiarev <[email protected]> ---
MmFile class destructor makes only two system calls:
~this()
{
  unmap();
  errnoEnforce(fd == -1 || fd <= 2 || .close(fd) != -1, 
    "Could not close handle");
}
and the second one, .close(fd), fails with EBADF errno, obviously the file
descriptor is already closed. Somehow GC converts descriptive error message
into general InvalidMemoryOperationError.
What I found, if the File is created as independent instance, it is always
deleted first, so the file descriptor is closed once in File destructor and
after that is tried to be closed in MmFile destructor resulting to an
exception.
  I would recommend (at least as temporary fix for POSIX) to exclude .close()
result check, the only meaningful error returned is due to close() duplicate
call, which is harmless.
  Also a question, how it happens that File destructor is always called before
MmFile one? I tried all possible combinations to create them with same result.

--

Reply via email to