diff options
author | Peter Harris <git@peter.is-a-geek.org> | 2010-12-24 11:59:46 -0500 |
---|---|---|
committer | Peter Harris <git@peter.is-a-geek.org> | 2010-12-24 14:22:52 -0500 |
commit | a8c3801c410ec7acd009d5c14ca1e9b8c4381325 (patch) | |
tree | 60430a380c2fd022418e4573181760c6ec042188 | |
parent | 605eb2a9747ca7f03c6b6aede3abeb454f545d65 (diff) |
Automatically insert Sync requests where needed
-rw-r--r-- | test.go | 4 | ||||
-rw-r--r-- | xgob.go | 25 |
2 files changed, 25 insertions, 4 deletions
@@ -36,11 +36,11 @@ func main () { done := make(chan uint32) - cookie1 := c.WriteRequest(gifRequest[:4]) + cookie1 := c.WriteReplyRequest(gifRequest[:4]) go decodeGif(cookie1, done, error) gifRequest[3] = 2 // bad length - cookie2 := c.WriteRequest(gifRequest[:]) + cookie2 := c.WriteReplyRequest(gifRequest[:]) go decodeGif(cookie2, done, error) c.Flush() @@ -48,6 +48,7 @@ type Connection struct { writeMutex sync.Mutex lastRequestWritten uint64 lastSequenceRead uint64 + lastReplierSent uint64 } const events_before_readblock = 10000 @@ -360,7 +361,13 @@ func (c *Connection) Disconnect () { func (c *Connection) WriteMultiRequest (req []byte, expected int) chan interface{} { if c == nil || c.conn == nil { - return rv + return nil + } + + replier := true + if (expected < 1) { + expected = 1 + replier = false } rv := make(chan interface {}, expected) @@ -371,10 +378,24 @@ func (c *Connection) WriteMultiRequest (req []byte, expected int) chan interface c.registerReply(rv) c.conn.Write(req) + if replier { + c.lastReplierSent = c.lastRequestWritten + } else { + if c.lastRequestWritten - c.lastReplierSent >= 65534 { + c.registerReply(make(chan interface{}, 1)) + c.conn.Write([]byte{43,0,0,1}) + c.lastReplierSent = c.lastRequestWritten + } + } + return rv } -func (c *Connection) WriteRequest (req []byte) chan interface{} { +func (c *Connection) WriteNoreplyRequest (req []byte) chan interface{} { + return c.WriteMultiRequest(req, 0) +} + +func (c *Connection) WriteReplyRequest (req []byte) chan interface{} { return c.WriteMultiRequest(req, 1) } |