tracker/server/store/memory/string_store.go

94 lines
1.6 KiB
Go
Raw Normal View History

2016-03-03 09:39:19 +01:00
// Copyright 2016 The Chihaya Authors. All rights reserved.
// Use of this source code is governed by the BSD 2-Clause license,
// which can be found in the LICENSE file.
package memory
import (
"sync"
"github.com/chihaya/chihaya/server/store"
)
func init() {
store.RegisterStringStoreDriver("memory", &stringStoreDriver{})
}
type stringStoreDriver struct{}
2016-03-11 21:09:49 +01:00
func (d *stringStoreDriver) New(_ *store.DriverConfig) (store.StringStore, error) {
2016-03-03 09:39:19 +01:00
return &stringStore{
strings: make(map[string]struct{}),
closed: make(chan struct{}),
2016-03-03 09:39:19 +01:00
}, nil
}
type stringStore struct {
strings map[string]struct{}
closed chan struct{}
2016-03-03 09:39:19 +01:00
sync.RWMutex
}
var _ store.StringStore = &stringStore{}
func (ss *stringStore) PutString(s string) error {
ss.Lock()
defer ss.Unlock()
select {
case <-ss.closed:
panic("attempted to interact with stopped store")
default:
}
2016-03-03 09:39:19 +01:00
ss.strings[s] = struct{}{}
return nil
}
func (ss *stringStore) HasString(s string) (bool, error) {
ss.RLock()
defer ss.RUnlock()
select {
case <-ss.closed:
panic("attempted to interact with stopped store")
default:
}
2016-03-03 09:39:19 +01:00
_, ok := ss.strings[s]
return ok, nil
}
func (ss *stringStore) RemoveString(s string) error {
ss.Lock()
defer ss.Unlock()
select {
case <-ss.closed:
panic("attempted to interact with stopped store")
default:
}
if _, ok := ss.strings[s]; !ok {
return store.ErrResourceDoesNotExist
}
2016-03-03 09:39:19 +01:00
delete(ss.strings, s)
return nil
}
func (ss *stringStore) Stop() <-chan error {
toReturn := make(chan error)
go func() {
ss.Lock()
defer ss.Unlock()
ss.strings = make(map[string]struct{})
close(ss.closed)
close(toReturn)
}()
return toReturn
}