Bad file descriptor in File destructor

Moritz Maxeiner via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 13 04:15:56 PDT 2017


On Thursday, 13 July 2017 at 10:28:30 UTC, unDEFER wrote:
> On Thursday, 13 July 2017 at 08:53:24 UTC, Moritz Maxeiner 
> wrote:
>> Where does that `File` come from? If it's std.stdio.File, that 
>> one is a struct with internal reference counting, so it 
>> shouldn't crash in the above. Could you provide a minimal 
>> working (in this case crashing) example?
>
> Yes File is std.stdio.File. And I can't provide a minimal 
> crashing example because this code crashes very rarely.
>
> I just want to put try/catch and don't know where to do it.

Well, if you get an ErrnoException on std.stdio.File.~this you 
are AFAIK either encountering an OS bug, or you have previously 
corrupted the file descriptor that File instance wraps around. To 
be specific, it sounds to me like you're trying to close a file 
descriptor that's already been closed, i.e. you should fix that 
instead of trying to work around the consequences of it.
Under the assumption, though, that it's an OS bug you're 
encountering, you can't deal with it with just a try catch in 
that function, because a (stack allocated) struct's destructor is 
always called when it goes out of scope.
I see essentially two workarounds:
- Use two functions foo and bar, where bar has `file` on it's 
stack, and `foo` calls `bar` and catches the destructor exception 
via try catch block around the call to `bar`
- Hide the `file` from the automatic out-of-scope destruction by 
using another type for storage

Personally I'd prefer the second variant, it could look like this:

---
ubyte[File.sizeof] _file;
ref File file() { return *(cast(File*) &_file[0]); }
[create File instance and assign to file]
scope (exit) destroy(file);
---


More information about the Digitalmars-d-learn mailing list