9 SimpleLockStack struct {
10 Current *SimpleLockStackElement
11 Creator func() interface{}
18 SimpleLockStackElement struct {
20 Previous *SimpleLockStackElement
21 Next *SimpleLockStackElement
23 ObjectDestroy interface {
28 func NewStackLock(startsize, maxsize int, creator func() interface{}) *SimpleLockStack {
29 ss := &SimpleLockStack{lock: sync.Mutex{}, Current: &SimpleLockStackElement{Value: creator()}, Creator: creator, maxsize: maxsize}
31 elements := make([]SimpleLockStackElement, startsize-1)
33 for i := range elements {
42 ss.capacity, ss.len, ss.active = startsize, startsize, 0
48 func (s *SimpleLockStack) Pop() (value interface{}) {
52 // Pool is empty, create a new item to return
57 value = s.Current.Value
59 if s.Current.Previous != nil {
60 s.Current = s.Current.Previous
63 // println("Pop ",value, s.len, s.active, s.capacity, s.Current.Next)
67 func (s *SimpleLockStack) Push(value interface{}) {
68 if d, ok := value.(ObjectDestroy); ok {
74 s.Current.Value = value
75 } else if s.len < s.maxsize {
76 if s.Current.Next == nil {
77 s.Current.Next = &SimpleLockStackElement{Value: value, Previous: s.Current}
80 s.Current.Next.Value = value
82 s.Current = s.Current.Next
84 // If we exceeded the capacity of stack do not store the created object
89 //println("Push ",value, s.len, s.active, s.capacity)
92 func (s *SimpleLockStack) Len() int {
95 func (s *SimpleLockStack) Capacity() int {
98 func (s *SimpleLockStack) Active() int {
101 func (s *SimpleLockStack) String() string {
102 return fmt.Sprintf("SS: Capacity:%d Active:%d Stored:%d", s.capacity, s.active, s.len)