35 lines
		
	
	
		
			835 B
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			835 B
		
	
	
	
		
			Go
		
	
	
package swift
 | 
						|
 | 
						|
import (
 | 
						|
	"io"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// An io.Reader which resets a watchdog timer whenever data is read
 | 
						|
type watchdogReader struct {
 | 
						|
	timeout time.Duration
 | 
						|
	reader  io.Reader
 | 
						|
	timer   *time.Timer
 | 
						|
}
 | 
						|
 | 
						|
// Returns a new reader which will kick the watchdog timer whenever data is read
 | 
						|
func newWatchdogReader(reader io.Reader, timeout time.Duration, timer *time.Timer) *watchdogReader {
 | 
						|
	return &watchdogReader{
 | 
						|
		timeout: timeout,
 | 
						|
		reader:  reader,
 | 
						|
		timer:   timer,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Read reads up to len(p) bytes into p
 | 
						|
func (t *watchdogReader) Read(p []byte) (n int, err error) {
 | 
						|
	// FIXME limit the amount of data read in one chunk so as to not exceed the timeout?
 | 
						|
	resetTimer(t.timer, t.timeout)
 | 
						|
	n, err = t.reader.Read(p)
 | 
						|
	resetTimer(t.timer, t.timeout)
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// Check it satisfies the interface
 | 
						|
var _ io.Reader = &watchdogReader{}
 |