LINUXTALKS.CO

История изменений

Исправление 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
}