~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Andrew Bennetts
  • Date: 2009-11-25 07:27:43 UTC
  • mto: This revision was merged to the branch mainline in revision 4825.
  • Revision ID: andrew.bennetts@canonical.com-20091125072743-v6sv4m2mkt9iyslp
Terminate SSHSubprocesses when no refs to them are left, in case .close is never called.

Show diffs side-by-side

added added

removed removed

Lines of Context:
638
638
                'close_fds': True,
639
639
                }
640
640
 
 
641
import weakref
 
642
_subproc_weakrefs = set()
 
643
 
 
644
def _close_ssh_proc(proc):
 
645
    for func in [proc.stdin.close, proc.stdout.close, proc.wait]:
 
646
        try:
 
647
            func()
 
648
        except OSError:
 
649
            pass
 
650
 
641
651
 
642
652
class SSHSubprocess(object):
643
653
    """A socket-like object that talks to an ssh subprocess via pipes."""
644
654
 
645
655
    def __init__(self, proc):
646
656
        self.proc = proc
 
657
        # Add a weakref to proc that will attempt to do the same as self.close
 
658
        # to avoid leaving processes lingering indefinitely.
 
659
        def terminate(ref):
 
660
            _subproc_weakrefs.remove(ref)
 
661
            _close_ssh_proc(proc)
 
662
        _subproc_weakrefs.add(weakref.ref(self, terminate))
647
663
 
648
664
    def send(self, data):
649
665
        return os.write(self.proc.stdin.fileno(), data)
652
668
        return os.read(self.proc.stdout.fileno(), count)
653
669
 
654
670
    def close(self):
655
 
        self.proc.stdin.close()
656
 
        self.proc.stdout.close()
657
 
        self.proc.wait()
 
671
        _close_ssh_proc(self.proc)
658
672
 
659
673
    def get_filelike_channels(self):
660
674
        return (self.proc.stdout, self.proc.stdin)