| 
					
				 | 
			
			
				@@ -3,6 +3,7 @@ package kcp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"io" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"net" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"runtime" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"sync" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"sync/atomic" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -280,7 +281,7 @@ func (c *Connection) waitForDataInput() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return io.EOF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	duration := time.Minute 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	duration := time.Second * 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if !c.rd.IsZero() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		duration = time.Until(c.rd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if duration < 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -288,9 +289,21 @@ func (c *Connection) waitForDataInput() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < 16; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		select { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case <-c.dataInput.Wait(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			runtime.Gosched() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	timeout := time.NewTimer(duration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer timeout.Stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	select { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	case <-c.dataInput.Wait(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	case <-time.After(duration): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case <-timeout.C: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if !c.rd.IsZero() && c.rd.Before(time.Now()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return ErrIOTimeout 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -330,9 +343,21 @@ func (c *Connection) waitForDataOutput() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i := 0; i < 16; i++ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		select { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case <-c.dataInput.Wait(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			runtime.Gosched() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	timeout := time.NewTimer(duration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer timeout.Stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	select { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	case <-c.dataOutput.Wait(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	case <-time.After(duration): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case <-timeout.C: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if !c.wd.IsZero() && c.wd.Before(time.Now()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return ErrIOTimeout 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 |