1
0
Fork 0
burlesque/request.go

98 lines
1.5 KiB
Go
Raw Normal View History

2014-07-10 12:19:39 +00:00
package main
import (
2014-07-16 18:57:54 +00:00
"sync"
2014-07-10 12:19:39 +00:00
)
type (
Request struct {
2014-07-17 13:22:37 +00:00
Queues []string
ResponseCh chan Response
Abort chan bool
Dead bool
2014-07-10 12:19:39 +00:00
}
Response struct {
Queue string
Message Message
}
)
var (
2014-07-16 18:57:54 +00:00
pool struct {
Requests []*Request
mutex sync.Mutex
}
2014-07-10 12:19:39 +00:00
)
2014-07-16 18:57:54 +00:00
func RegisterPublication(q string, msg Message) bool {
2014-07-17 13:22:37 +00:00
for _, r := range pool.Requests {
if r.Dead {
continue
}
for _, qname := range r.Queues {
if qname == q {
rsp := Response{Queue: q, Message: msg}
ok := r.TryRespond(rsp)
if ok {
return true
}
2014-07-10 12:19:39 +00:00
}
}
}
2014-07-16 17:50:05 +00:00
ok := GetQueue(q).Push(msg)
return ok
2014-07-10 12:19:39 +00:00
}
2014-07-16 18:57:54 +00:00
func RegisterSubscription(r *Request) {
2014-07-17 13:22:37 +00:00
for _, qname := range r.Queues {
q := GetQueue(qname)
2014-07-16 17:50:05 +00:00
msg, ok := q.TryFetch(r.Abort)
2014-07-12 10:42:26 +00:00
if ok {
2014-07-17 13:22:37 +00:00
rsp := Response{Queue: qname, Message: msg}
ok := r.TryRespond(rsp)
if !ok {
q.Push(msg)
}
2014-07-10 12:19:39 +00:00
return
}
}
2014-07-16 18:57:54 +00:00
pool.Requests = append(pool.Requests, r)
2014-07-17 13:22:37 +00:00
}
func (r *Request) TryRespond(rsp Response) bool {
okch := make(chan bool)
go func() {
defer func() {
err := recover()
if err != nil { // Panic!
2014-07-17 13:22:37 +00:00
r.Dead = true
okch <- false
}
}()
r.ResponseCh <- rsp // If channel is already closed expect a panic
2014-07-17 13:22:37 +00:00
okch <- true
}()
ok := <-okch
return ok
2014-07-10 12:19:39 +00:00
}
2014-07-16 18:57:54 +00:00
func (r *Request) Purge() {
pool.mutex.Lock()
defer pool.mutex.Unlock()
r.Dead = true
deleted := 0
for i, req := range pool.Requests {
if req.Dead {
pool.Requests = append(pool.Requests[:i-deleted], pool.Requests[i-deleted+1:]...)
deleted++
2014-07-10 12:19:39 +00:00
}
}
}