cycr 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/changelog.txt +4 -0
- data/lib/cyc/cache.rb +31 -3
- data/lib/cyc/client.rb +16 -10
- data/lib/cyc/version.rb +1 -1
- metadata +2 -2
data/changelog.txt
CHANGED
data/lib/cyc/cache.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'thread'
|
1
2
|
require 'ref'
|
2
3
|
|
3
4
|
module Cyc
|
@@ -5,6 +6,31 @@ module Cyc
|
|
5
6
|
def initialize
|
6
7
|
@soft_references = Ref::SoftValueMap.new
|
7
8
|
@hard_references = {}
|
9
|
+
@in_progress = {}
|
10
|
+
@lock = Mutex.new
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get cached value of a key or generate new one using given block
|
14
|
+
def cached_value(key)
|
15
|
+
monitor = value = nil
|
16
|
+
@lock.synchronize do
|
17
|
+
if @hard_references.has_key?(key)
|
18
|
+
return @hard_references[key]
|
19
|
+
elsif (value = @soft_references[key])
|
20
|
+
return value
|
21
|
+
elsif (monitor = @in_progress[key])
|
22
|
+
monitor.wait(@lock)
|
23
|
+
return self[key]
|
24
|
+
end
|
25
|
+
@in_progress[key] = monitor = ConditionVariable.new
|
26
|
+
end
|
27
|
+
value = yield
|
28
|
+
@lock.synchronize do
|
29
|
+
self[key] = value
|
30
|
+
@in_progress.delete key
|
31
|
+
monitor.broadcast
|
32
|
+
end
|
33
|
+
value
|
8
34
|
end
|
9
35
|
|
10
36
|
# Get a value from cache.
|
@@ -19,7 +45,7 @@ module Cyc
|
|
19
45
|
# Put a value for a given key to the cache.
|
20
46
|
def []=(key,value)
|
21
47
|
case value
|
22
|
-
when TrueClass,FalseClass,NilClass,Fixnum
|
48
|
+
when TrueClass,FalseClass,NilClass,Fixnum,::Symbol
|
23
49
|
@soft_references.delete(key)
|
24
50
|
@hard_references[key] = value
|
25
51
|
else
|
@@ -30,8 +56,10 @@ module Cyc
|
|
30
56
|
|
31
57
|
# Clear the cache.
|
32
58
|
def clear
|
33
|
-
@
|
34
|
-
|
59
|
+
@lock.synchronize do
|
60
|
+
@soft_references.clear
|
61
|
+
@hard_references.clear
|
62
|
+
end
|
35
63
|
end
|
36
64
|
end
|
37
65
|
end
|
data/lib/cyc/client.rb
CHANGED
@@ -29,6 +29,11 @@ module Cyc #:nodoc:
|
|
29
29
|
# (and calls based on it -- i.e. direct Cyc calls, e.g. cyc.genls :Dog).
|
30
30
|
attr_accessor :cache_enabled
|
31
31
|
|
32
|
+
# The +cache+ instance of a client.
|
33
|
+
# You may call +clear+ on it to clear cache's content,
|
34
|
+
# You may copy it's reference to the other client instances.
|
35
|
+
attr_accessor :cache
|
36
|
+
|
32
37
|
# The +host+ the client connects to.
|
33
38
|
attr_reader :host
|
34
39
|
|
@@ -55,7 +60,7 @@ module Cyc #:nodoc:
|
|
55
60
|
# - +:host+ = +localhost+ server address
|
56
61
|
# - +:port+ = +3601+ server port
|
57
62
|
# - +:debug+ = +false+ initial debug flag
|
58
|
-
# - +:cache+ = +false+ initial cache enabled flag
|
63
|
+
# - +:cache+ = +false+ initial cache enabled flag or external cache instance
|
59
64
|
# - +:timeout+ = +0.2+ connection timeout in seconds
|
60
65
|
# - +:url+ (String): +cyc://host:port+ overrides +:host+, +:port+
|
61
66
|
# - +:driver+ (Class) = Cyc::Connection::Socket client connection driver class
|
@@ -85,8 +90,9 @@ module Cyc #:nodoc:
|
|
85
90
|
@timeout = (options[:timeout] || 0.2).to_f
|
86
91
|
@driver = options[:driver] || Connection.driver
|
87
92
|
@debug = !!options[:debug]
|
88
|
-
|
89
|
-
@
|
93
|
+
cache = options[:cache]
|
94
|
+
@cache_enabled = !!cache
|
95
|
+
@cache = cache.respond_to?(:cached_value) ? cache : Cache.new
|
90
96
|
@thread_safe = !!options[:thread_safe]
|
91
97
|
|
92
98
|
if @thread_safe
|
@@ -149,15 +155,15 @@ module Cyc #:nodoc:
|
|
149
155
|
|
150
156
|
# Sends the +messsage+ to the Cyc server and returns a parsed answer.
|
151
157
|
def talk(message, options={})
|
152
|
-
if @cache_enabled && @cache[message]
|
153
|
-
return @cache[message]
|
154
|
-
end
|
155
|
-
send_message(message)
|
156
|
-
result = receive_answer(options)
|
157
158
|
if @cache_enabled
|
158
|
-
@cache
|
159
|
+
@cache.cached_value(message) do
|
160
|
+
send_message(message)
|
161
|
+
receive_answer(options)
|
162
|
+
end
|
163
|
+
else
|
164
|
+
send_message(message)
|
165
|
+
receive_answer(options)
|
159
166
|
end
|
160
|
-
result
|
161
167
|
end
|
162
168
|
|
163
169
|
# Sends the +message+ to the Cyc server and
|
data/lib/cyc/version.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: cycr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Aleksander Pohl
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2012-06-
|
14
|
+
date: 2012-06-14 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rspec
|