in reply to Re^3: Perl jumps to END logic after fileno (Win32)
in thread Perl jumps to END logic after fileno (Win32)
Thanks. At first I was responding with "it's not that easy", but this actually seems like it might have helped.
I am creating the threads from within a "constructor" in a package and need to close a file handle that is being assigned to a scalar rather than a type glob. Since the scalar is scoped to the scope of the subroutine and the thread logic was outside of that function I was attempting to pass the handle as an argument to the thread, which fails in various ways.
If I declare the thread logic in an anonymous sub nested inside the "constructor" it seems like I will be able to just reference the scalar within that same scope and be able to close the copy that gets dup'd into the new thread.
Test mockup works, I just need to test it with pipes and all the other details
#!/usr/bin/perl -- use strict; use warnings; use autodie qw/ open close /; use threads stack_size => 4096; package test; sub doit { my $self = {}; my $FOO; open $FOO, '<', 'WISDOM.ico' or die $!; my $threadcode = sub { close $FOO; eval { close $FOO; 1 } or warn $@; sleep 60; return; }; $self->{'th'} = threads->create($threadcode); close $FOO; eval { close $FOO; 1 } or warn $@; bless $self; } sub joinit { my ($self) = @_; my $th = $self->{'th'}; $th->join(); } my $t = test::doit(); print "thread created\n"; # OS Tests here indicate the file descriptor is closed $t->joinit(); print "thread ended\n"; sleep 100;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Perl jumps to END logic after fileno (Win32)
by Anonymous Monk on Aug 10, 2017 at 23:33 UTC |