mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 07:32:32 +01:00
refactor(channelserver): extract UserBinaryStore and MinidataStore
The userBinary and minidata maps with their locks were spread across Server as raw fields with manual lock management. Cross-channel session searches also required acquiring nested locks (server lock + binary lock). Encapsulating in dedicated types eliminates the nested locking and reduces Server's field count by 4.
This commit is contained in:
56
server/channelserver/user_binary_store.go
Normal file
56
server/channelserver/user_binary_store.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package channelserver
|
||||
|
||||
import "sync"
|
||||
|
||||
// userBinaryPartID is the composite key for a user binary part.
|
||||
type userBinaryPartID struct {
|
||||
charID uint32
|
||||
index uint8
|
||||
}
|
||||
|
||||
// UserBinaryStore is a thread-safe store for per-character binary data parts.
|
||||
type UserBinaryStore struct {
|
||||
mu sync.RWMutex
|
||||
data map[userBinaryPartID][]byte
|
||||
}
|
||||
|
||||
// NewUserBinaryStore creates an empty UserBinaryStore.
|
||||
func NewUserBinaryStore() *UserBinaryStore {
|
||||
return &UserBinaryStore{data: make(map[userBinaryPartID][]byte)}
|
||||
}
|
||||
|
||||
// Get returns the binary data for the given character and index.
|
||||
func (s *UserBinaryStore) Get(charID uint32, index uint8) ([]byte, bool) {
|
||||
s.mu.RLock()
|
||||
data, ok := s.data[userBinaryPartID{charID: charID, index: index}]
|
||||
s.mu.RUnlock()
|
||||
return data, ok
|
||||
}
|
||||
|
||||
// GetCopy returns a copy of the binary data, safe for use after the lock is released.
|
||||
func (s *UserBinaryStore) GetCopy(charID uint32, index uint8) []byte {
|
||||
s.mu.RLock()
|
||||
src := s.data[userBinaryPartID{charID: charID, index: index}]
|
||||
if len(src) == 0 {
|
||||
s.mu.RUnlock()
|
||||
return nil
|
||||
}
|
||||
dst := make([]byte, len(src))
|
||||
copy(dst, src)
|
||||
s.mu.RUnlock()
|
||||
return dst
|
||||
}
|
||||
|
||||
// Set stores binary data for the given character and index.
|
||||
func (s *UserBinaryStore) Set(charID uint32, index uint8, data []byte) {
|
||||
s.mu.Lock()
|
||||
s.data[userBinaryPartID{charID: charID, index: index}] = data
|
||||
s.mu.Unlock()
|
||||
}
|
||||
|
||||
// Delete removes binary data for the given character and index.
|
||||
func (s *UserBinaryStore) Delete(charID uint32, index uint8) {
|
||||
s.mu.Lock()
|
||||
delete(s.data, userBinaryPartID{charID: charID, index: index})
|
||||
s.mu.Unlock()
|
||||
}
|
||||
Reference in New Issue
Block a user