Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
4d117478
Commit
4d117478
authored
Jun 19, 2015
by
obscuren
Committed by
Jeffrey Wilcke
Jun 29, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
deps: Added golang-lru
parent
6ca3a446
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
718 additions
and
1 deletion
+718
-1
Godeps.json
Godeps/Godeps.json
+6
-1
.gitignore
..._workspace/src/github.com/hashicorp/golang-lru/.gitignore
+23
-0
LICENSE
...ps/_workspace/src/github.com/hashicorp/golang-lru/LICENSE
+362
-0
README.md
.../_workspace/src/github.com/hashicorp/golang-lru/README.md
+25
-0
lru.go
Godeps/_workspace/src/github.com/hashicorp/golang-lru/lru.go
+175
-0
lru_test.go
...workspace/src/github.com/hashicorp/golang-lru/lru_test.go
+127
-0
No files found.
Godeps/Godeps.json
View file @
4d117478
{
"ImportPath"
:
"github.com/ethereum/go-ethereum"
,
"GoVersion"
:
"go1.4
.2
"
,
"GoVersion"
:
"go1.4"
,
"Packages"
:
[
"./..."
],
...
...
@@ -28,6 +28,11 @@
"ImportPath"
:
"github.com/gizak/termui"
,
"Rev"
:
"bab8dce01c193d82bc04888a0a9a7814d505f532"
},
{
"ImportPath"
:
"github.com/howeyc/fsnotify"
,
"Comment"
:
"v0.9.0-11-g6b1ef89"
,
"Rev"
:
"6b1ef893dc11e0447abda6da20a5203481878dda"
},
{
"ImportPath"
:
"github.com/huin/goupnp"
,
"Rev"
:
"5cff77a69fb22f5f1774c4451ea2aab63d4d2f20"
...
...
Godeps/_workspace/src/github.com/hashicorp/golang-lru/.gitignore
0 → 100644
View file @
4d117478
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
*.test
Godeps/_workspace/src/github.com/hashicorp/golang-lru/LICENSE
0 → 100644
View file @
4d117478
This diff is collapsed.
Click to expand it.
Godeps/_workspace/src/github.com/hashicorp/golang-lru/README.md
0 → 100644
View file @
4d117478
golang-lru
==========
This provides the
`lru`
package which implements a fixed-size
thread safe LRU cache. It is based on the cache in Groupcache.
Documentation
=============
Full docs are available on
[
Godoc
](
http://godoc.org/github.com/hashicorp/golang-lru
)
Example
=======
Using the LRU is very simple:
```
go
l
,
_
:=
New
(
128
)
for
i
:=
0
;
i
<
256
;
i
++
{
l
.
Add
(
i
,
nil
)
}
if
l
.
Len
()
!=
128
{
panic
(
fmt
.
Sprintf
(
"bad len: %v"
,
l
.
Len
()))
}
```
Godeps/_workspace/src/github.com/hashicorp/golang-lru/lru.go
0 → 100644
View file @
4d117478
// This package provides a simple LRU cache. It is based on the
// LRU implementation in groupcache:
// https://github.com/golang/groupcache/tree/master/lru
package
lru
import
(
"container/list"
"errors"
"sync"
)
// Cache is a thread-safe fixed size LRU cache.
type
Cache
struct
{
size
int
evictList
*
list
.
List
items
map
[
interface
{}]
*
list
.
Element
lock
sync
.
RWMutex
onEvicted
func
(
key
interface
{},
value
interface
{})
}
// entry is used to hold a value in the evictList
type
entry
struct
{
key
interface
{}
value
interface
{}
}
// New creates an LRU of the given size
func
New
(
size
int
)
(
*
Cache
,
error
)
{
return
NewWithEvict
(
size
,
nil
)
}
func
NewWithEvict
(
size
int
,
onEvicted
func
(
key
interface
{},
value
interface
{}))
(
*
Cache
,
error
)
{
if
size
<=
0
{
return
nil
,
errors
.
New
(
"Must provide a positive size"
)
}
c
:=
&
Cache
{
size
:
size
,
evictList
:
list
.
New
(),
items
:
make
(
map
[
interface
{}]
*
list
.
Element
,
size
),
onEvicted
:
onEvicted
,
}
return
c
,
nil
}
// Purge is used to completely clear the cache
func
(
c
*
Cache
)
Purge
()
{
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
if
c
.
onEvicted
!=
nil
{
for
k
,
v
:=
range
c
.
items
{
c
.
onEvicted
(
k
,
v
.
Value
.
(
*
entry
)
.
value
)
}
}
c
.
evictList
=
list
.
New
()
c
.
items
=
make
(
map
[
interface
{}]
*
list
.
Element
,
c
.
size
)
}
// Add adds a value to the cache. Returns true if an eviction occured.
func
(
c
*
Cache
)
Add
(
key
,
value
interface
{})
bool
{
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
// Check for existing item
if
ent
,
ok
:=
c
.
items
[
key
];
ok
{
c
.
evictList
.
MoveToFront
(
ent
)
ent
.
Value
.
(
*
entry
)
.
value
=
value
return
false
}
// Add new item
ent
:=
&
entry
{
key
,
value
}
entry
:=
c
.
evictList
.
PushFront
(
ent
)
c
.
items
[
key
]
=
entry
evict
:=
c
.
evictList
.
Len
()
>
c
.
size
// Verify size not exceeded
if
evict
{
c
.
removeOldest
()
}
return
evict
}
// Get looks up a key's value from the cache.
func
(
c
*
Cache
)
Get
(
key
interface
{})
(
value
interface
{},
ok
bool
)
{
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
if
ent
,
ok
:=
c
.
items
[
key
];
ok
{
c
.
evictList
.
MoveToFront
(
ent
)
return
ent
.
Value
.
(
*
entry
)
.
value
,
true
}
return
}
// Check if a key is in the cache, without updating the recent-ness or deleting it for being stale.
func
(
c
*
Cache
)
Contains
(
key
interface
{})
(
ok
bool
)
{
c
.
lock
.
RLock
()
defer
c
.
lock
.
RUnlock
()
_
,
ok
=
c
.
items
[
key
]
return
ok
}
// Returns the key value (or undefined if not found) without updating the "recently used"-ness of the key.
// (If you find yourself using this a lot, you might be using the wrong sort of data structure, but there are some use cases where it's handy.)
func
(
c
*
Cache
)
Peek
(
key
interface
{})
(
value
interface
{},
ok
bool
)
{
c
.
lock
.
RLock
()
defer
c
.
lock
.
RUnlock
()
if
ent
,
ok
:=
c
.
items
[
key
];
ok
{
return
ent
.
Value
.
(
*
entry
)
.
value
,
true
}
return
nil
,
ok
}
// Remove removes the provided key from the cache.
func
(
c
*
Cache
)
Remove
(
key
interface
{})
{
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
if
ent
,
ok
:=
c
.
items
[
key
];
ok
{
c
.
removeElement
(
ent
)
}
}
// RemoveOldest removes the oldest item from the cache.
func
(
c
*
Cache
)
RemoveOldest
()
{
c
.
lock
.
Lock
()
defer
c
.
lock
.
Unlock
()
c
.
removeOldest
()
}
// Keys returns a slice of the keys in the cache, from oldest to newest.
func
(
c
*
Cache
)
Keys
()
[]
interface
{}
{
c
.
lock
.
RLock
()
defer
c
.
lock
.
RUnlock
()
keys
:=
make
([]
interface
{},
len
(
c
.
items
))
ent
:=
c
.
evictList
.
Back
()
i
:=
0
for
ent
!=
nil
{
keys
[
i
]
=
ent
.
Value
.
(
*
entry
)
.
key
ent
=
ent
.
Prev
()
i
++
}
return
keys
}
// Len returns the number of items in the cache.
func
(
c
*
Cache
)
Len
()
int
{
c
.
lock
.
RLock
()
defer
c
.
lock
.
RUnlock
()
return
c
.
evictList
.
Len
()
}
// removeOldest removes the oldest item from the cache.
func
(
c
*
Cache
)
removeOldest
()
{
ent
:=
c
.
evictList
.
Back
()
if
ent
!=
nil
{
c
.
removeElement
(
ent
)
}
}
// removeElement is used to remove a given list element from the cache
func
(
c
*
Cache
)
removeElement
(
e
*
list
.
Element
)
{
c
.
evictList
.
Remove
(
e
)
kv
:=
e
.
Value
.
(
*
entry
)
delete
(
c
.
items
,
kv
.
key
)
if
c
.
onEvicted
!=
nil
{
c
.
onEvicted
(
kv
.
key
,
kv
.
value
)
}
}
Godeps/_workspace/src/github.com/hashicorp/golang-lru/lru_test.go
0 → 100644
View file @
4d117478
package
lru
import
"testing"
func
TestLRU
(
t
*
testing
.
T
)
{
evictCounter
:=
0
onEvicted
:=
func
(
k
interface
{},
v
interface
{})
{
if
k
!=
v
{
t
.
Fatalf
(
"Evict values not equal (%v!=%v)"
,
k
,
v
)
}
evictCounter
+=
1
}
l
,
err
:=
NewWithEvict
(
128
,
onEvicted
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %v"
,
err
)
}
for
i
:=
0
;
i
<
256
;
i
++
{
l
.
Add
(
i
,
i
)
}
if
l
.
Len
()
!=
128
{
t
.
Fatalf
(
"bad len: %v"
,
l
.
Len
())
}
if
evictCounter
!=
128
{
t
.
Fatalf
(
"bad evict count: %v"
,
evictCounter
)
}
for
i
,
k
:=
range
l
.
Keys
()
{
if
v
,
ok
:=
l
.
Get
(
k
);
!
ok
||
v
!=
k
||
v
!=
i
+
128
{
t
.
Fatalf
(
"bad key: %v"
,
k
)
}
}
for
i
:=
0
;
i
<
128
;
i
++
{
_
,
ok
:=
l
.
Get
(
i
)
if
ok
{
t
.
Fatalf
(
"should be evicted"
)
}
}
for
i
:=
128
;
i
<
256
;
i
++
{
_
,
ok
:=
l
.
Get
(
i
)
if
!
ok
{
t
.
Fatalf
(
"should not be evicted"
)
}
}
for
i
:=
128
;
i
<
192
;
i
++
{
l
.
Remove
(
i
)
_
,
ok
:=
l
.
Get
(
i
)
if
ok
{
t
.
Fatalf
(
"should be deleted"
)
}
}
l
.
Get
(
192
)
// expect 192 to be last key in l.Keys()
for
i
,
k
:=
range
l
.
Keys
()
{
if
(
i
<
63
&&
k
!=
i
+
193
)
||
(
i
==
63
&&
k
!=
192
)
{
t
.
Fatalf
(
"out of order key: %v"
,
k
)
}
}
l
.
Purge
()
if
l
.
Len
()
!=
0
{
t
.
Fatalf
(
"bad len: %v"
,
l
.
Len
())
}
if
_
,
ok
:=
l
.
Get
(
200
);
ok
{
t
.
Fatalf
(
"should contain nothing"
)
}
}
// test that Add returns true/false if an eviction occured
func
TestLRUAdd
(
t
*
testing
.
T
)
{
evictCounter
:=
0
onEvicted
:=
func
(
k
interface
{},
v
interface
{})
{
evictCounter
+=
1
}
l
,
err
:=
NewWithEvict
(
1
,
onEvicted
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %v"
,
err
)
}
if
l
.
Add
(
1
,
1
)
==
true
||
evictCounter
!=
0
{
t
.
Errorf
(
"should not have an eviction"
)
}
if
l
.
Add
(
2
,
2
)
==
false
||
evictCounter
!=
1
{
t
.
Errorf
(
"should have an eviction"
)
}
}
// test that Contains doesn't update recent-ness
func
TestLRUContains
(
t
*
testing
.
T
)
{
l
,
err
:=
New
(
2
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %v"
,
err
)
}
l
.
Add
(
1
,
1
)
l
.
Add
(
2
,
2
)
if
!
l
.
Contains
(
1
)
{
t
.
Errorf
(
"1 should be contained"
)
}
l
.
Add
(
3
,
3
)
if
l
.
Contains
(
1
)
{
t
.
Errorf
(
"Contains should not have updated recent-ness of 1"
)
}
}
// test that Peek doesn't update recent-ness
func
TestLRUPeek
(
t
*
testing
.
T
)
{
l
,
err
:=
New
(
2
)
if
err
!=
nil
{
t
.
Fatalf
(
"err: %v"
,
err
)
}
l
.
Add
(
1
,
1
)
l
.
Add
(
2
,
2
)
if
v
,
ok
:=
l
.
Peek
(
1
);
!
ok
||
v
!=
1
{
t
.
Errorf
(
"1 should be set to 1: %v, %v"
,
v
,
ok
)
}
l
.
Add
(
3
,
3
)
if
l
.
Contains
(
1
)
{
t
.
Errorf
(
"should not have updated recent-ness of 1"
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment