in reply to Re: Net::SSH2 exec timeout
in thread Net::SSH2 exec timeout

I like your solution and am perfectly fine with it hanging until the timeout. . However, I still get the same error as I would with a normal threads in that $ssh is not correctly passed
Thread 1 terminated abnormally: Can't call method "exec" on an undefined value at Configuration.pl
If I pass the $ssh in as a ref:
$ssh_ref = \$ssh; async { print "Upgrading firmware, this will take about 3 minutes. +\n"; my $chan = $$ssh_ref->channel(); $chan->exec("/sbin/fwupdate -m\n"); $chan->close; }->detach;

I get this error. . I have NO idea what it means.
perl: ath.c:193: _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed.
Maybe I need to lock the var before I use it? Thoughts?

The & does not seem to help either. .

Replies are listed 'Best First'.
Re^3: Net::SSH2 exec timeout
by BrowserUk (Patriarch) on Sep 08, 2011 at 22:32 UTC

    Why are you using a reference to the object instead of the object?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Sorry for the confusion, I tried both.

      First using the object directly I get the error: Thread 1 terminated abnormally: Can't call method "exec" on an undefined value at Configuration.pl

      Then, if I try to pass it in as a reference as it looks like $ssh is coming in undefined, I get the error: perl: ath.c:193: _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed.
        it looks like $ssh is coming in undefined,

        That doesn't happen with normal blessed objects:

        #! perl -slw use strict; use threads; package Test; sub new{ bless [], $_[0] } sub exec{ print 'exec method called from thread: ', threads->tid } package main; my $o = Test->new; $o->exec; async{ $o->exec; }->detach; sleep 1; $o->exec; __END__ c:\test>tobj exec method called from thread: 0 exec method called from thread: 1 exec method called from thread: 0

        Which probably means that there is some misbegotten code in Net::SSH2 that is attempting to make it "thread-safe".

        The next thing to try is creating the ssh object inside the thread:

        use threads; use Net::SSH2; async { my $ssh = Net::SSH2->new( ... ); $ssh->scp_put($firmware[$antenna_type],'/tmp/fwupdate.bin'); print "Upgrading firmware, this will take about 3 minutes.\n"; my $chan = $ssh->channel(); $chan->exec("/sbin/fwupdate -m\n"); $chan->close; }->detach; ...

        Again, that ought to work, but I have no way to test this speculation!


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.