freelist.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // Copyright 2015 Google Inc. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package freelist
  15. import "unsafe"
  16. // A freelist for arbitrary pointers. Not safe for concurrent access.
  17. type Freelist struct {
  18. list []unsafe.Pointer
  19. }
  20. // Get an element from the freelist, returning nil if empty.
  21. func (fl *Freelist) Get() (p unsafe.Pointer) {
  22. l := len(fl.list)
  23. if l == 0 {
  24. return
  25. }
  26. p = fl.list[l-1]
  27. fl.list = fl.list[:l-1]
  28. return
  29. }
  30. // Contribute an element back to the freelist.
  31. func (fl *Freelist) Put(p unsafe.Pointer) {
  32. fl.list = append(fl.list, p)
  33. }