summaryrefslogtreecommitdiffstats
path: root/hugolib/pageCache.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/pageCache.go')
-rw-r--r--hugolib/pageCache.go136
1 files changed, 0 insertions, 136 deletions
diff --git a/hugolib/pageCache.go b/hugolib/pageCache.go
deleted file mode 100644
index 485da4ba3..000000000
--- a/hugolib/pageCache.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2015 The Hugo Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package hugolib
-
-import (
- "sync"
-)
-
-type pageCacheEntry struct {
- in []Pages
- out Pages
-}
-
-func (entry pageCacheEntry) matches(pageLists []Pages) bool {
- if len(entry.in) != len(pageLists) {
- return false
- }
- for i, p := range pageLists {
- if !pagesEqual(p, entry.in[i]) {
- return false
- }
- }
-
- return true
-}
-
-type pageCache struct {
- sync.RWMutex
- m map[string][]pageCacheEntry
-}
-
-func newPageCache() *pageCache {
- return &pageCache{m: make(map[string][]pageCacheEntry)}
-}
-
-func (c *pageCache) clear() {
- c.Lock()
- defer c.Unlock()
- c.m = make(map[string][]pageCacheEntry)
-}
-
-// get/getP gets a Pages slice from the cache matching the given key and
-// all the provided Pages slices.
-// If none found in cache, a copy of the first slice is created.
-//
-// If an apply func is provided, that func is applied to the newly created copy.
-//
-// The getP variant' apply func takes a pointer to Pages.
-//
-// The cache and the execution of the apply func is protected by a RWMutex.
-func (c *pageCache) get(key string, apply func(p Pages), pageLists ...Pages) (Pages, bool) {
- return c.getP(key, func(p *Pages) {
- if apply != nil {
- apply(*p)
- }
- }, pageLists...)
-}
-
-func (c *pageCache) getP(key string, apply func(p *Pages), pageLists ...Pages) (Pages, bool) {
- c.RLock()
- if cached, ok := c.m[key]; ok {
- for _, entry := range cached {
- if entry.matches(pageLists) {
- c.RUnlock()
- return entry.out, true
- }
- }
- }
- c.RUnlock()
-
- c.Lock()
- defer c.Unlock()
-
- // double-check
- if cached, ok := c.m[key]; ok {
- for _, entry := range cached {
- if entry.matches(pageLists) {
- return entry.out, true
- }
- }
- }
-
- p := pageLists[0]
- pagesCopy := append(Pages(nil), p...)
-
- if apply != nil {
- apply(&pagesCopy)
- }
-
- entry := pageCacheEntry{in: pageLists, out: pagesCopy}
- if v, ok := c.m[key]; ok {
- c.m[key] = append(v, entry)
- } else {
- c.m[key] = []pageCacheEntry{entry}
- }
-
- return pagesCopy, false
-
-}
-
-// pagesEqual returns whether p1 and p2 are equal.
-func pagesEqual(p1, p2 Pages) bool {
- if p1 == nil && p2 == nil {
- return true
- }
-
- if p1 == nil || p2 == nil {
- return false
- }
-
- if p1.Len() != p2.Len() {
- return false
- }
-
- if p1.Len() == 0 {
- return true
- }
-
- for i := 0; i < len(p1); i++ {
- if p1[i] != p2[i] {
- return false
- }
- }
- return true
-}