craps
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CartPacketQueue struct {
|
||||
@@ -70,14 +71,34 @@ func (p *CartPacketQueue) HandleConnection(connection *PersistentConnection) err
|
||||
}
|
||||
|
||||
func (p *CartPacketQueue) HandleData(t CartMessage, id CartId, data CallResult) {
|
||||
p.getListener(t, id, func(l *Listener) {
|
||||
l.Chan <- data
|
||||
l.Count--
|
||||
})
|
||||
// p.mu.Lock()
|
||||
// defer p.mu.Unlock()
|
||||
// pl, ok := p.expectedPackages[t]
|
||||
// if ok {
|
||||
// l, ok := (*pl)[id]
|
||||
// if ok {
|
||||
// l.Chan <- data
|
||||
// l.Count--
|
||||
// if l.Count == 0 {
|
||||
// close(l.Chan)
|
||||
// delete(*pl, id)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
func (p *CartPacketQueue) getListener(t CartMessage, id CartId, fn func(*Listener)) {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
pl, ok := p.expectedPackages[t]
|
||||
if ok {
|
||||
l, ok := (*pl)[id]
|
||||
if ok {
|
||||
l.Chan <- data
|
||||
l.Count--
|
||||
fn(&l)
|
||||
if l.Count == 0 {
|
||||
close(l.Chan)
|
||||
delete(*pl, id)
|
||||
@@ -86,6 +107,30 @@ func (p *CartPacketQueue) HandleData(t CartMessage, id CartId, data CallResult)
|
||||
}
|
||||
}
|
||||
|
||||
func CallResultWithTimeout(onTimeout func() CallResult) chan CallResult {
|
||||
ch := make(chan CallResult, 1)
|
||||
resultCh := make(chan CallResult, 1)
|
||||
select {
|
||||
case ret := <-resultCh:
|
||||
ch <- ret
|
||||
case <-time.After(300 * time.Millisecond):
|
||||
ch <- onTimeout()
|
||||
}
|
||||
return ch
|
||||
}
|
||||
|
||||
func (p *CartPacketQueue) MakeChannel(messageType CartMessage, id CartId) chan CallResult {
|
||||
return CallResultWithTimeout(func() CallResult {
|
||||
p.getListener(messageType, id, func(l *Listener) {
|
||||
l.Count--
|
||||
})
|
||||
return CallResult{
|
||||
StatusCode: 504,
|
||||
Data: []byte("timeout cart call"),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func (p *CartPacketQueue) Expect(messageType CartMessage, id CartId) <-chan CallResult {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
@@ -95,15 +140,17 @@ func (p *CartPacketQueue) Expect(messageType CartMessage, id CartId) <-chan Call
|
||||
idl.Count++
|
||||
return idl.Chan
|
||||
}
|
||||
ch := make(chan CallResult)
|
||||
ch := p.MakeChannel(messageType, id)
|
||||
|
||||
(*l)[id] = Listener{
|
||||
Chan: ch,
|
||||
Count: 1,
|
||||
}
|
||||
|
||||
return ch
|
||||
}
|
||||
|
||||
ch := make(chan CallResult)
|
||||
ch := p.MakeChannel(messageType, id)
|
||||
p.expectedPackages[messageType] = &CartListener{
|
||||
id: Listener{
|
||||
Chan: ch,
|
||||
|
||||
Reference in New Issue
Block a user