@@ -456,6 +456,7 @@ def __getattr__(self, name):
456
456
457
457
class MultiCapture (object ):
458
458
out = err = in_ = None
459
+ _state = None
459
460
460
461
def __init__ (self , out = True , err = True , in_ = True , Capture = None ):
461
462
if in_ :
@@ -466,9 +467,16 @@ def __init__(self, out=True, err=True, in_=True, Capture=None):
466
467
self .err = Capture (2 )
467
468
468
469
def __repr__ (self ):
469
- return "<MultiCapture out=%r err=%r in_=%r>" % (self .out , self .err , self .in_ )
470
+ return "<MultiCapture out=%r err=%r in_=%r _state=%r _in_suspended=%r>" % (
471
+ self .out ,
472
+ self .err ,
473
+ self .in_ ,
474
+ self ._state ,
475
+ getattr (self , "_in_suspended" , "<UNSET>" ),
476
+ )
470
477
471
478
def start_capturing (self ):
479
+ self ._state = "started"
472
480
if self .in_ :
473
481
self .in_ .start ()
474
482
if self .out :
@@ -486,6 +494,7 @@ def pop_outerr_to_orig(self):
486
494
return out , err
487
495
488
496
def suspend_capturing (self , in_ = False ):
497
+ self ._state = "suspended"
489
498
if self .out :
490
499
self .out .suspend ()
491
500
if self .err :
@@ -495,6 +504,7 @@ def suspend_capturing(self, in_=False):
495
504
self ._in_suspended = True
496
505
497
506
def resume_capturing (self ):
507
+ self ._state = "resumed"
498
508
if self .out :
499
509
self .out .resume ()
500
510
if self .err :
@@ -505,9 +515,9 @@ def resume_capturing(self):
505
515
506
516
def stop_capturing (self ):
507
517
""" stop capturing and reset capturing streams """
508
- if hasattr ( self , "_reset" ) :
518
+ if self . _state == "stopped" :
509
519
raise ValueError ("was already stopped" )
510
- self ._reset = True
520
+ self ._state = "stopped"
511
521
if self .out :
512
522
self .out .done ()
513
523
if self .err :
@@ -535,6 +545,7 @@ class FDCaptureBinary(object):
535
545
"""
536
546
537
547
EMPTY_BUFFER = b""
548
+ _state = None
538
549
539
550
def __init__ (self , targetfd , tmpfile = None ):
540
551
self .targetfd = targetfd
@@ -561,9 +572,10 @@ def __init__(self, targetfd, tmpfile=None):
561
572
self .tmpfile_fd = tmpfile .fileno ()
562
573
563
574
def __repr__ (self ):
564
- return "<FDCapture %s oldfd=%s>" % (
575
+ return "<FDCapture %s oldfd=%s _state=%r >" % (
565
576
self .targetfd ,
566
577
getattr (self , "targetfd_save" , None ),
578
+ self ._state ,
567
579
)
568
580
569
581
def start (self ):
@@ -574,6 +586,7 @@ def start(self):
574
586
raise ValueError ("saved filedescriptor not valid anymore" )
575
587
os .dup2 (self .tmpfile_fd , self .targetfd )
576
588
self .syscapture .start ()
589
+ self ._state = "started"
577
590
578
591
def snap (self ):
579
592
self .tmpfile .seek (0 )
@@ -590,14 +603,17 @@ def done(self):
590
603
os .close (targetfd_save )
591
604
self .syscapture .done ()
592
605
_attempt_to_close_capture_file (self .tmpfile )
606
+ self ._state = "done"
593
607
594
608
def suspend (self ):
595
609
self .syscapture .suspend ()
596
610
os .dup2 (self .targetfd_save , self .targetfd )
611
+ self ._state = "suspended"
597
612
598
613
def resume (self ):
599
614
self .syscapture .resume ()
600
615
os .dup2 (self .tmpfile_fd , self .targetfd )
616
+ self ._state = "resumed"
601
617
602
618
def writeorg (self , data ):
603
619
""" write to original file descriptor. """
@@ -625,6 +641,7 @@ def snap(self):
625
641
class SysCapture (object ):
626
642
627
643
EMPTY_BUFFER = str ()
644
+ _state = None
628
645
629
646
def __init__ (self , fd , tmpfile = None ):
630
647
name = patchsysdict [fd ]
@@ -637,8 +654,17 @@ def __init__(self, fd, tmpfile=None):
637
654
tmpfile = CaptureIO ()
638
655
self .tmpfile = tmpfile
639
656
657
+ def __repr__ (self ):
658
+ return "<SysCapture %s _old=%r, tmpfile=%r _state=%r>" % (
659
+ self .name ,
660
+ self ._old ,
661
+ self .tmpfile ,
662
+ self ._state ,
663
+ )
664
+
640
665
def start (self ):
641
666
setattr (sys , self .name , self .tmpfile )
667
+ self ._state = "started"
642
668
643
669
def snap (self ):
644
670
res = self .tmpfile .getvalue ()
@@ -650,12 +676,15 @@ def done(self):
650
676
setattr (sys , self .name , self ._old )
651
677
del self ._old
652
678
_attempt_to_close_capture_file (self .tmpfile )
679
+ self ._state = "done"
653
680
654
681
def suspend (self ):
655
682
setattr (sys , self .name , self ._old )
683
+ self ._state = "suspended"
656
684
657
685
def resume (self ):
658
686
setattr (sys , self .name , self .tmpfile )
687
+ self ._state = "resumed"
659
688
660
689
def writeorg (self , data ):
661
690
self ._old .write (data )
0 commit comments