Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Perl under windows: mysteriously skipping over subroutine

by UnstoppableDrew (Sexton)
on Apr 23, 2008 at 21:42 UTC ( [id://682504]=note: print w/replies, xml ) Need Help??


in reply to Perl under windows: mysteriously skipping over subroutine

Ok, this is what I get for assuming other people can write code. mr_mischief was correct, the calls to pathrm were not using the second argument to force the call to pathempty. My bad for not re-reading the docs. Makes me wonder how this ever worked, as the return value of pathrm was not being checked so every call to delete a directory was silently failing and being ignored. Now that I'm done chasing that red herring, perhaps I can solve the original problem.

This one server has been throwing the error:
closedir() attempted on invalid dirhandle PTH_DH at C:\Work\trunk\3pty\perl\lib/File/Copy/Recursive.pm line 318.

After some extensive time in the debugger, here's what seems to be happening:

pathrmdir calls pathempty, which opens the directory and iterates over the items, calling unlink for files and pathrmdir for directories. At some point it hits a directory, the sole content of which is an empty directory . pathrmdir calls pathempty which calls pathrmdir which calls pathempty, which does nothing and returns. pathrmdir calls rmdir on the empty directory and returns. Back in pathempty it tries to close the dir handle and exits with code 9.

I think these functions need to localize the dir handle it's using, I'm surprised this doesn't come up more often. I have just reproduced it using the following:

For a directory that looks like this:

C:\TMP\PATHTEST |--bar |--baz
where baz is the only thing in bar, and baz is empty, using this code:
perl -e "use File::Copy::Recursive qw(pathrmdir); pathrmdir('pathtest' +,1); print qq(done\n);"
the output is:
closedir() attempted on invalid dirhandle PTH_DH at c:\trunk\3pty\perl +\lib/File/Copy/Recursive.pm line 318. closedir() attempted on invalid dirhandle PTH_DH at c:\trunk\3pty\perl +\lib/File/Copy/Recursive.pm line 318. done

And that's on a different pc than the one originally showing the problem. I will try localizing the dir handle and see what happens.

Replies are listed 'Best First'.
Re^2: Perl under windows: mysteriously skipping over subroutine
by UnstoppableDrew (Sexton) on Apr 23, 2008 at 21:46 UTC
    Bingo! Adding 'local(*PTH_DH);' to pathempty() fixes it. Thanks for the nudge in the right direction to look.
Re^2: Perl under windows: mysteriously skipping over subroutine
by mr_mischief (Monsignor) on Apr 24, 2008 at 16:04 UTC
    Ok, this is what I get for assuming other people can write code. mr_mischief was correct, the calls to pathrm were not using the second argument to force the call to pathempty. My bad for not re-reading the docs.
    Actually, this is what you get for assuming someone else takes the time to write your code for you when you didn't take the time and make the effort to post what you had first. If you're having an issue with the length of that statement, just remember the words in bold. They make a sentence all their own.

    Troubleshooting code from a prose description of the problem without the source that's causing the problem is like a doctor trying to diagnose an illness from described symptoms without a fluid sample from the patient.

    Consider yourself lucky someone spent the time to diagnose your problem from the docs without seeing what you were doing.

    Now, you have a completely different problem to solve which someone might have solved for you the first time around had they been able to see your code. Help us help you. How (Not) To Ask A Question and Why Questions Go Unanswered (Thanks, Dominous!) might help you to help us help you.

    If you really want someone else to write the code from scratch instead of helping you with a specific issue you're having, there's always http://jobs.perl.org.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://682504]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (4)
As of 2024-04-24 13:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found