7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
64 lines
962 B
Go
64 lines
962 B
Go
package pool
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"go.uber.org/atomic"
|
|
)
|
|
|
|
type reqKey int64
|
|
|
|
type reqMap struct {
|
|
m map[reqKey]chan *poolConn
|
|
mux sync.Mutex
|
|
_ [4]byte
|
|
|
|
nextRequest atomic.Int64
|
|
}
|
|
|
|
func newReqMap() *reqMap {
|
|
return &reqMap{
|
|
m: map[reqKey]chan *poolConn{},
|
|
}
|
|
}
|
|
|
|
func (r *reqMap) request() (key reqKey, ch chan *poolConn) {
|
|
key = reqKey(r.nextRequest.Inc())
|
|
ch = make(chan *poolConn, 1)
|
|
|
|
r.mux.Lock()
|
|
r.m[key] = ch
|
|
r.mux.Unlock()
|
|
return key, ch
|
|
}
|
|
|
|
func (r *reqMap) transfer(c *poolConn) bool {
|
|
r.mux.Lock()
|
|
if len(r.m) < 1 { // no requests
|
|
r.mux.Unlock()
|
|
return false
|
|
}
|
|
|
|
var ch chan *poolConn
|
|
var k reqKey
|
|
for k, ch = range r.m { // Get one from map.
|
|
break
|
|
}
|
|
delete(r.m, k) // Remove from pending requests.
|
|
r.mux.Unlock()
|
|
|
|
if ch == nil {
|
|
panic("unreachable: channel can't be nil due to map not empty")
|
|
}
|
|
|
|
ch <- c
|
|
close(ch)
|
|
return true
|
|
}
|
|
|
|
func (r *reqMap) delete(key reqKey) {
|
|
r.mux.Lock()
|
|
delete(r.m, key)
|
|
r.mux.Unlock()
|
|
}
|