dbms_buffers 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ee12df3813b088a33c85ef865b7c6c68b8b1691ea96938394624ebcbb74cbc9
4
- data.tar.gz: c62465c4f2ec50e8ef7de8ee586a0c3b712565d1503971298639c2db7aa38c15
3
+ metadata.gz: ecd30b9102d2ae5019e77d92f2eb4f140c0dadb6dae4fa171d18152f944058e3
4
+ data.tar.gz: 13859d3f3c085f2f6977cb342a23154f0f253583bd0541efd4366cd0318da084
5
5
  SHA512:
6
- metadata.gz: 236576f69b30141a843f9278914fce0c88d02310f458a3ee3290bd9a60599f40333762726c4e479ced96f22f81d1f04a5a1ad9de7b8b25690ac015d7c3698efa
7
- data.tar.gz: e4f32e07e317a0f322e590770684a687cc5b334be9985fc8419821169f7e7e17446a46fb0d455b2b4e2565c3a10f701ba233217367e22cabd8a5352efb5db728
6
+ metadata.gz: fe9527c8764c2840f12a80db1ef358eeb0474f4125e025a1b530ce25588ebb9b70c497be48343d018db960ed80d6b0c085f94a916e8adb8553c2edf7e9602f50
7
+ data.tar.gz: d5bf0be491d9c3c390afa103de0bc43980d46ee75a98bda3d29465542c237426d53b8061715ab032c01cbf80391d8d82bce3d9b8bd21d732782312d67bc5410c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## CHANGELOG
2
2
 
3
- ## Current
3
+ ## 0.2
4
+
5
+ * GCLOCK added (thx @N-Schaef)
6
+ * Security updates
7
+ * Small fixes
8
+
9
+ ## 0.1.1
4
10
 
5
11
  * Gem created, rubocop added.
data/Gemfile.lock CHANGED
@@ -27,7 +27,7 @@ GEM
27
27
  ast (~> 2.4.0)
28
28
  psych (3.1.0)
29
29
  rainbow (3.0.0)
30
- rake (10.5.0)
30
+ rake (13.0.3)
31
31
  reek (5.5.0)
32
32
  codeclimate-engine-rb (~> 0.4.0)
33
33
  kwalify (~> 0.7.0)
@@ -69,7 +69,7 @@ PLATFORMS
69
69
  DEPENDENCIES
70
70
  bundler (~> 2.0)
71
71
  dbms_buffers!
72
- rake (~> 10.0)
72
+ rake (~> 13.0)
73
73
  reek (~> 5.5.0)
74
74
  rspec (~> 3.0)
75
75
  rubocop (~> 0.78)
data/dbms_buffers.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
 
29
29
  spec.add_development_dependency 'bundler', '~> 2.0'
30
- spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rake', '~> 13.0'
31
31
  spec.add_development_dependency 'reek', '~> 5.5.0'
32
32
  spec.add_development_dependency 'rspec', '~> 3.0'
33
33
  spec.add_development_dependency 'rubocop', '~> 0.78'
data/lib/dbms_buffers.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'dbms_buffers/version'
4
4
  require 'dbms_buffers/clock'
5
+ require 'dbms_buffers/gclock'
5
6
  require 'dbms_buffers/generators'
6
7
  require 'dbms_buffers/lru'
7
8
 
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DbmsBuffers
4
+ GClockBufferEntry = Struct.new(:value, :clock_value)
5
+
6
+ # The generalized clock buffer arranges entries in a logical clock and a single hand.
7
+ # When the buffer is full and a not-yet-inserted entry needs space,
8
+ # the hand goes clockwise until it finds an entry with clock_value = 0.
9
+ # The found entry is evicted, removed from the buffer, and the new values
10
+ # is inserted with clock_value 1.
11
+ # All entries the hand passes where clock_value = 1, this value is decremented,
12
+ # but they are not replaced yet (they have a second chance).
13
+ # When an element is accessed, its value is incremented by 1.
14
+ class GClockBuffer
15
+ attr_reader :pointer, :size
16
+
17
+ def initialize(size)
18
+ @size = size
19
+ @buffer = []
20
+ @pointer = 0
21
+ end
22
+
23
+ def access(value)
24
+ try_touch(value) || try_insert_new(value) || try_replace(value)
25
+ end
26
+
27
+ def clock_value_of(value)
28
+ @buffer[index(value)].clock_value
29
+ end
30
+
31
+ def entries
32
+ @buffer.clone
33
+ end
34
+
35
+ def contains?(value)
36
+ @buffer.any? { |entry| value == entry.value }
37
+ end
38
+
39
+ def used
40
+ @buffer.size
41
+ end
42
+
43
+ private
44
+
45
+ # If value is contained in the buffer, it's value is set to 1
46
+ # and true is returned, otherwise false
47
+ def try_touch(value)
48
+ result = contains? value
49
+ touch(value) if result
50
+ result
51
+ end
52
+
53
+ # If buffer slots are free, inserts value and returns true.
54
+ def try_insert_new(value)
55
+ return false if used == @size
56
+
57
+ entry = GClockBufferEntry.new(value, 1)
58
+ @buffer[@pointer] = entry
59
+ advance_pointer
60
+
61
+ true
62
+ end
63
+
64
+ def try_replace(value)
65
+ entry = @buffer[@pointer]
66
+ if entry.clock_value.zero?
67
+ entry.value = value
68
+ entry.clock_value = 1
69
+ return true
70
+ end
71
+
72
+ entry.clock_value -= 1
73
+ advance_pointer
74
+ try_replace value
75
+ end
76
+
77
+ def advance_pointer
78
+ @pointer = (@pointer + 1) % @size
79
+ end
80
+
81
+ def index(value)
82
+ @buffer.index { |entry| entry.value == value }
83
+ end
84
+
85
+ def touch(value)
86
+ @buffer.find { |entry| entry.value == value }.clock_value += 1
87
+ end
88
+ end
89
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DbmsBuffers
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbms_buffers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Dossinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-07 00:00:00.000000000 Z
11
+ date: 2021-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: reek
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -104,6 +104,7 @@ files:
104
104
  - dbms_buffers.gemspec
105
105
  - lib/dbms_buffers.rb
106
106
  - lib/dbms_buffers/clock.rb
107
+ - lib/dbms_buffers/gclock.rb
107
108
  - lib/dbms_buffers/generators.rb
108
109
  - lib/dbms_buffers/lru.rb
109
110
  - lib/dbms_buffers/version.rb