forked from cwtch.im/cwtch
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package bridge
|
|
|
|
import (
|
|
"cwtch.im/cwtch/event"
|
|
"sync"
|
|
)
|
|
|
|
type goChanBridge struct {
|
|
in chan event.IPCMessage
|
|
out chan event.IPCMessage
|
|
closedChan chan bool
|
|
closed bool
|
|
lock sync.Mutex
|
|
}
|
|
|
|
// MakeGoChanBridge returns a simple testing IPCBridge made from inprocess go channels
|
|
func MakeGoChanBridge() (b1, b2 event.IPCBridge) {
|
|
chan1 := make(chan event.IPCMessage)
|
|
chan2 := make(chan event.IPCMessage)
|
|
closed := make(chan bool)
|
|
|
|
a := &goChanBridge{in: chan1, out: chan2, closedChan: closed, closed: false}
|
|
b := &goChanBridge{in: chan2, out: chan1, closedChan: closed, closed: false}
|
|
|
|
go monitor(a, b)
|
|
|
|
return a, b
|
|
}
|
|
|
|
func monitor(a, b *goChanBridge) {
|
|
<-a.closedChan
|
|
a.closed = true
|
|
b.closed = true
|
|
a.closedChan <- true
|
|
}
|
|
|
|
func (pb *goChanBridge) Read() (*event.IPCMessage, bool) {
|
|
message, ok := <-pb.in
|
|
return &message, ok
|
|
}
|
|
|
|
func (pb *goChanBridge) Write(message *event.IPCMessage) {
|
|
pb.lock.Lock()
|
|
defer pb.lock.Unlock()
|
|
if !pb.closed {
|
|
pb.out <- *message
|
|
}
|
|
}
|
|
|
|
func (pb *goChanBridge) Shutdown() {
|
|
if !pb.closed {
|
|
close(pb.in)
|
|
close(pb.out)
|
|
pb.closedChan <- true
|
|
<-pb.closedChan
|
|
}
|
|
}
|