• Joe Tsai's avatar
    io: simplify pipe implementation · 371eda45
    Joe Tsai authored
    In the distant past, Pipe was implemented with channels and a
    long running pipe.run goroutine (see CL 994043).
    This approach of having all communication serialized through the
    run method was error prone giving Pipe a history of deadlocks
    and race conditions.
    
    After the introduction of sync.Cond, the implementation was rewritten
    (see CL 4252057) to use condition variables and avoid the
    long running pipe.run goroutine. While this implementation is superior
    to the previous one, this implementation is strange in that the
    p.data field is always set immediately prior to signaling the other
    goroutine with Cond.Signal, effectively making the combination of the
    two a channel-like operation. Inferior to a channel, however, this still
    requires explicit locking around the p.data field.
    
    The data+rwait can be effectively be replaced by a "chan []byte" to
    inform a reader that there is data available.
    The data+wwait can be effectively be replaced by a "chan int" to
    inform a writer of how many bytes were read.
    
    This implementation is a simplified from net.Pipe in CL 37402.
    
    Change-Id: Ia5b26320b0525934fd87a3b69a091c787167f5aa
    Reviewed-on: https://go-review.googlesource.com/65330
    Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBryan Mills <bcmills@google.com>
    371eda45
pipe.go 4.52 KB