Исправление rezedent12, (текущая версия) :
На данный момент реализация такая:
https://text-host.ru/realizatsiya-buferov-s-myagkim-limitom-na-go-gnu-gpl-v3
Копия:
type BufferWebSocketMessage struct {
Messages map[uint64]*WebSocketMessage // Очередь сообщений
MuMessages sync.Mutex // Мьютекс для очереди сообщений
CountWrite uint64 // Индекс последнего записанного сообщения
CountRead uint64 // Индекс последнего прочитанного сообщения
LimitBuffer uint64 // Мягкий лимит сообщений
}
func (b *BufferWebSocketMessage) Put(msg *WebSocketMessage) bool { // добавляет новое сообщение в буфер. Возвращает логическую еденицу если лимит превышен.
var exceeded bool
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
t := b.CountWrite + 1 // счётчик
if t == math.MaxUint64 { // Если очередь достигла 18446744073709551615 сообщений
t = 0
}
if b.Messages == nil {
b.Messages = make(map[uint64]*WebSocketMessage)
}
b.CountWrite = t
b.Messages[b.CountWrite] = msg
if b.LimitBuffer > 0 { // Лимит задан
if b.CountWrite > b.CountRead {
c := b.CountWrite - b.CountRead
if c > b.LimitBuffer {
exceeded = true
}
}
}
return exceeded
}
func (b *BufferWebSocketMessage) Get() (*WebSocketMessage, bool) {
var msg *WebSocketMessage
var ok bool
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
if b.CountRead == b.CountWrite {
msg = nil
ok = false // Нет новых сообщений
} else {
t := b.CountRead + 1
if t == math.MaxUint64 { // Если счётчик достиг максимального значения
t = 0
}
b.CountRead = t
msg, ok = b.Messages[b.CountRead]
if ok {
delete(b.Messages, b.CountRead)
}
}
return msg, ok
}
func (b *BufferWebSocketMessage) Clear() {
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
b.Messages = make(map[uint64]*WebSocketMessage)
b.CountRead = 0
b.CountWrite = 0
}
Исходная версия rezedent12, :
На данный момент реализация такая:
type BufferWebSocketMessage struct {
Messages map[uint64]*WebSocketMessage // Очередь сообщений
MuMessages sync.Mutex // Мьютекс для очереди сообщений
CountWrite uint64 // Индекс последнего записанного сообщения
CountRead uint64 // Индекс последнего прочитанного сообщения
LimitBuffer uint64 // Мягкий лимит сообщений
}
func (b *BufferWebSocketMessage) Put(msg *WebSocketMessage) bool { // добавляет новое сообщение в буфер. Возвращает логическую еденицу если лимит превышен.
var exceeded bool
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
t := b.CountWrite + 1 // счётчик
if t == math.MaxUint64 { // Если очередь достигла 18446744073709551615 сообщений
t = 0
}
if b.Messages == nil {
b.Messages = make(map[uint64]*WebSocketMessage)
}
b.CountWrite = t
b.Messages[b.CountWrite] = msg
if b.LimitBuffer > 0 { // Лимит задан
if b.CountWrite > b.CountRead {
c := b.CountWrite - b.CountRead
if c > b.LimitBuffer {
exceeded = true
}
}
}
return exceeded
}
func (b *BufferWebSocketMessage) Get() (*WebSocketMessage, bool) {
var msg *WebSocketMessage
var ok bool
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
if b.CountRead == b.CountWrite {
msg = nil
ok = false // Нет новых сообщений
} else {
t := b.CountRead + 1
if t == math.MaxUint64 { // Если счётчик достиг максимального значения
t = 0
}
b.CountRead = t
msg, ok = b.Messages[b.CountRead]
if ok {
delete(b.Messages, b.CountRead)
}
}
return msg, ok
}
func (b *BufferWebSocketMessage) Clear() {
b.MuMessages.Lock()
defer b.MuMessages.Unlock()
b.Messages = make(map[uint64]*WebSocketMessage)
b.CountRead = 0
b.CountWrite = 0
}