summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Harris <git@peter.is-a-geek.org>2010-12-24 11:59:46 -0500
committerPeter Harris <git@peter.is-a-geek.org>2010-12-24 14:22:52 -0500
commita8c3801c410ec7acd009d5c14ca1e9b8c4381325 (patch)
tree60430a380c2fd022418e4573181760c6ec042188
parent605eb2a9747ca7f03c6b6aede3abeb454f545d65 (diff)
Automatically insert Sync requests where needed
-rw-r--r--test.go4
-rw-r--r--xgob.go25
2 files changed, 25 insertions, 4 deletions
diff --git a/test.go b/test.go
index a0b7c22..e42733d 100644
--- a/test.go
+++ b/test.go
@@ -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()
diff --git a/xgob.go b/xgob.go
index 1f4294e..44f66c8 100644
--- a/xgob.go
+++ b/xgob.go
@@ -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)
}