diff --git a/channel/chan.go b/channel/chan.go
index <HASH>..<HASH> 100644
--- a/channel/chan.go
+++ b/channel/chan.go
@@ -36,6 +36,7 @@ recv:
 	}
 
 	for !queue.Empty(pending) {
-		next <- pending.Pop()
+		next <- pending.Peek()
+		pending.Pop()
 	}
 }
diff --git a/pipe.go b/pipe.go
index <HASH>..<HASH> 100644
--- a/pipe.go
+++ b/pipe.go
@@ -69,7 +69,7 @@ func outFeed(w io.Writer, out <-chan interface{}) (n int64, err error) {
 	for output := range out {
 		p := output.(*Packet)
 		x := copy(data, p.data)
-		p.ok <- empty
+		<-p.ok
 		var m int
 		for len(data[m:x]) > 0 {
 			m, err = w.Write(data[m:x])
diff --git a/queue.go b/queue.go
index <HASH>..<HASH> 100644
--- a/queue.go
+++ b/queue.go
@@ -40,7 +40,7 @@ func (q *BufferQueue) Peek() (b interface{}) {
 }
 
 func (q *BufferQueue) Pop() (b interface{}) {
-	<-q.top.ok
+	q.top.ok <- empty
 	q.Buffer.FastForward(len(q.top.data))
 	return q.top
 }
Fixed a bug where deadlock would occur during the ChanQueue's final stage