litestack 0.1.5 → 0.1.7
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 +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +6 -6
- data/bench/bench.rb +3 -3
- data/bench/bench_cache_raw.rb +1 -1
- data/bench/bench_jobs_raw.rb +28 -12
- data/bench/bench_queue.rb +2 -2
- data/bench/skjob.rb +5 -3
- data/bench/uljob.rb +5 -4
- data/lib/active_record/connection_adapters/litedb_adapter.rb +1 -1
- data/lib/active_support/cache/litecache.rb +4 -2
- data/lib/litestack/litecache.rb +53 -49
- data/lib/litestack/litejobqueue.rb +34 -18
- data/lib/litestack/litequeue.rb +17 -14
- data/lib/litestack/litesupport.rb +76 -1
- data/lib/litestack/version.rb +1 -1
- data/lib/sequel/adapters/shared/litedb.rb +1054 -0
- metadata +3 -3
- data/lib/active_support/cache/ultralite_cache_store.rb +0 -100
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'sqlite3'
|
2
|
+
require 'hiredis'
|
2
3
|
|
3
4
|
module Litesupport
|
4
5
|
|
@@ -11,6 +12,11 @@ module Litesupport
|
|
11
12
|
@env ||= detect_environment
|
12
13
|
end
|
13
14
|
|
15
|
+
def self.max_contexts
|
16
|
+
return 50 if environment == :fiber || environment == :polyphony
|
17
|
+
5
|
18
|
+
end
|
19
|
+
|
14
20
|
# identify which environment we are running in
|
15
21
|
# we currently support :fiber, :polyphony, :iodine & :threaded
|
16
22
|
# in the future we might want to expand to other environments
|
@@ -33,6 +39,18 @@ module Litesupport
|
|
33
39
|
# we should never reach here
|
34
40
|
end
|
35
41
|
|
42
|
+
def self.detect_context
|
43
|
+
if environment == :fiber || environment == :poylphony
|
44
|
+
Fiber.current.storage
|
45
|
+
else
|
46
|
+
Thread.current
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.context
|
51
|
+
@ctx ||= detect_context
|
52
|
+
end
|
53
|
+
|
36
54
|
# switch the execution context to allow others to run
|
37
55
|
def self.switch
|
38
56
|
if self.environment == :fiber
|
@@ -43,7 +61,7 @@ module Litesupport
|
|
43
61
|
Thread.current.switch_fiber
|
44
62
|
true
|
45
63
|
else
|
46
|
-
#
|
64
|
+
#Thread.pass
|
47
65
|
false
|
48
66
|
end
|
49
67
|
end
|
@@ -71,7 +89,64 @@ module Litesupport
|
|
71
89
|
db = SQLite3::Database.new(path)
|
72
90
|
db.busy_handler{ switch || sleep(0.001) }
|
73
91
|
db.journal_mode = "WAL"
|
92
|
+
db.instance_variable_set(:@stmts, {})
|
93
|
+
class << db
|
94
|
+
attr_reader :stmts
|
95
|
+
end
|
74
96
|
db
|
75
97
|
end
|
76
98
|
|
99
|
+
class Mutex
|
100
|
+
|
101
|
+
def initialize
|
102
|
+
@mutex = Thread::Mutex.new
|
103
|
+
end
|
104
|
+
|
105
|
+
def synchronize(&block)
|
106
|
+
if Litesupport.environment == :threaded || Litesupport.environment == :iodine
|
107
|
+
@mutex.synchronize{ block.call }
|
108
|
+
else
|
109
|
+
block.call
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
class Pool
|
116
|
+
|
117
|
+
def initialize(count, &block)
|
118
|
+
@count = count
|
119
|
+
@block = block
|
120
|
+
@resources = []
|
121
|
+
@mutex = Litesupport::Mutex.new
|
122
|
+
@count.times do
|
123
|
+
resource = @mutex.synchronize{ block.call }
|
124
|
+
@resources << [resource, :free]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def acquire
|
129
|
+
acquired = false
|
130
|
+
result = nil
|
131
|
+
while !acquired do
|
132
|
+
@mutex.synchronize do
|
133
|
+
if resource = @resources.find{|r| r[1] == :free }
|
134
|
+
resource[1] = :busy
|
135
|
+
begin
|
136
|
+
result = yield resource[0]
|
137
|
+
rescue Exception => e
|
138
|
+
raise e
|
139
|
+
ensure
|
140
|
+
resource[1] = :free
|
141
|
+
acquired = true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
sleep 0.001 unless acquired
|
146
|
+
end
|
147
|
+
result
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
77
152
|
end
|
data/lib/litestack/version.rb
CHANGED