This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #57512] Warnings for implicitly closed handles
authorFather Chrysostomos <sprout@cpan.org>
Thu, 18 Sep 2014 05:16:58 +0000 (21:16 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 3 Nov 2014 02:23:43 +0000 (18:23 -0800)
commit96d7c88819733eaaba892177a967d9e898b2b924
treedcc519ccc95d8fdc5e1c912e4b704da38d26f8a0
parentf4725fad1a6349bcfadca13ee4398f61799a29d0
[perl #57512] Warnings for implicitly closed handles

If the implicit close() fails, warn about it, mentioning $! in the
message.  This is a default warning in the io category.

We do this in two spots, sv_clear and gp_free.  While sv_clear would
be sufficient to get the warning emitted, the warning won’t contain
the name of the handle when called from there, because lone IO thing-
ies are nameless.  Doing it also when a GV’s glob pointer is freed--as
long as the IO thingy in there has a reference count of 1--allows the
name to be included in the message, because we still have the glob,
which is where the name is stored.

The result:

$ ./miniperl -Ilib -e 'open fh, ">/Volumes/Disk Image/foo"; print fh "x"x1000, "\n" for 1..50; undef *fh'
Warning: unable to close filehandle fh properly: No space left on device at -e line 1.
doio.c
embed.fnc
embed.h
gv.c
pod/perldiag.pod
proto.h
sv.c
t/io/eintr.t
t/op/lexsub.t