knjrbfw 0.0.28 → 0.0.29
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/knjrbfw.gemspec +7 -5
- data/lib/knj/autoload/facebooker.rb +1 -1
- data/lib/knj/eruby.rb +14 -14
- data/lib/knj/gtk2.rb +5 -4
- data/lib/knj/http2.rb +2 -2
- data/lib/knj/jruby/sqlitejdbc-v056.jar +0 -0
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +2 -2
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +1 -1
- data/lib/knj/knjdb/libknjdb.rb +23 -15
- data/lib/knj/objects/objects_sqlhelper.rb +1 -1
- data/lib/knj/php.rb +8 -13
- data/lib/knj/process.rb +53 -29
- data/lib/knj/process_meta.rb +5 -1
- data/lib/knj/scripts/php_to_rb_helper.rb +1 -1
- data/lib/knj/tests/test_degulesider.rb +2 -3
- data/lib/knj/threadsafe.rb +33 -0
- data/lib/knj/win.rb +4 -2
- data/lib/knj/wref.rb +1 -0
- data/spec/amixer_spec.rb +1 -1
- data/spec/db_spec.rb +11 -1
- data/spec/http2_spec.rb +1 -1
- data/spec/knjrbfw_spec.rb +4 -3
- data/spec/process_meta_spec.rb +25 -19
- data/spec/process_spec.rb +1 -1
- metadata +18 -16
data/Gemfile
CHANGED
@@ -7,7 +7,7 @@ source "http://rubygems.org"
|
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
9
|
gem "rspec", "~> 2.3.0"
|
10
|
-
gem "bundler", "
|
10
|
+
gem "bundler", ">= 1.0.0"
|
11
11
|
gem "jeweler", "~> 1.6.3"
|
12
12
|
gem "rcov", ">= 0"
|
13
13
|
gem "sqlite3" if RUBY_ENGINE != "jruby"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.29
|
data/knjrbfw.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjrbfw}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.29"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-
|
12
|
+
s.date = %q{2012-05-03}
|
13
13
|
s.description = %q{Including stuff for HTTP, SSH and much more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -156,6 +156,7 @@ Gem::Specification.new do |s|
|
|
156
156
|
"lib/knj/jruby-gtk2/treeview.rb",
|
157
157
|
"lib/knj/jruby-gtk2/vbox.rb",
|
158
158
|
"lib/knj/jruby-gtk2/window.rb",
|
159
|
+
"lib/knj/jruby/sqlitejdbc-v056.jar",
|
159
160
|
"lib/knj/jruby_compiler.rb",
|
160
161
|
"lib/knj/knj.rb",
|
161
162
|
"lib/knj/knj_controller.rb",
|
@@ -233,6 +234,7 @@ Gem::Specification.new do |s|
|
|
233
234
|
"lib/knj/thread2.rb",
|
234
235
|
"lib/knj/threadhandler.rb",
|
235
236
|
"lib/knj/threadpool.rb",
|
237
|
+
"lib/knj/threadsafe.rb",
|
236
238
|
"lib/knj/translations.rb",
|
237
239
|
"lib/knj/unix_proc.rb",
|
238
240
|
"lib/knj/web.rb",
|
@@ -270,14 +272,14 @@ Gem::Specification.new do |s|
|
|
270
272
|
|
271
273
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
272
274
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
273
|
-
s.add_development_dependency(%q<bundler>, ["
|
275
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
274
276
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
|
275
277
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
276
278
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
277
279
|
s.add_development_dependency(%q<rmagick>, [">= 0"])
|
278
280
|
else
|
279
281
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
280
|
-
s.add_dependency(%q<bundler>, ["
|
282
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
281
283
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
282
284
|
s.add_dependency(%q<rcov>, [">= 0"])
|
283
285
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
@@ -285,7 +287,7 @@ Gem::Specification.new do |s|
|
|
285
287
|
end
|
286
288
|
else
|
287
289
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
288
|
-
s.add_dependency(%q<bundler>, ["
|
290
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
289
291
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
290
292
|
s.add_dependency(%q<rcov>, [">= 0"])
|
291
293
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
data/lib/knj/eruby.rb
CHANGED
@@ -18,7 +18,7 @@ class Knj::Eruby
|
|
18
18
|
if RUBY_PLATFORM == "java" or RUBY_ENGINE == "rbx"
|
19
19
|
@cache_mode = :code_eval
|
20
20
|
#@cache_mode = :compile_knj
|
21
|
-
elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
|
21
|
+
elsif RUBY_VERSION.slice(0..2) == "1.9" #and RubyVM::InstructionSequence.respond_to?(:compile_file)
|
22
22
|
@cache_mode = :code_eval
|
23
23
|
#@cache_mode = :inseq
|
24
24
|
#@cache_mode = :compile_knj
|
@@ -37,21 +37,19 @@ class Knj::Eruby
|
|
37
37
|
@error = false
|
38
38
|
Dir.mkdir(@tmpdir) if !File.exists?(@tmpdir)
|
39
39
|
filename = File.expand_path(filename)
|
40
|
-
raise "File does not exist: #{filename}"
|
41
|
-
filetime = File.mtime(filename)
|
40
|
+
raise "File does not exist: #{filename}" unless File.exists?(filename)
|
42
41
|
cachename = "#{@tmpdir}/#{filename.gsub("/", "_").gsub(".", "_")}.cache"
|
42
|
+
filetime = File.mtime(filename)
|
43
43
|
cachetime = File.mtime(cachename) if File.exists?(cachename)
|
44
44
|
|
45
|
+
if !File.exists?(cachename) or filetime > cachetime
|
46
|
+
Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
|
47
|
+
File.chmod(0777, cachename)
|
48
|
+
cachetime = File.mtime(cachename)
|
49
|
+
reload_cache = true
|
50
|
+
end
|
51
|
+
|
45
52
|
begin
|
46
|
-
if !File.exists?(cachename) or filetime > cachetime
|
47
|
-
Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
|
48
|
-
File.chmod(0777, cachename)
|
49
|
-
cachetime = File.mtime(cachename)
|
50
|
-
reload_cache = true
|
51
|
-
elsif !@cache.key?(cachename)
|
52
|
-
reload_cache = true
|
53
|
-
end
|
54
|
-
|
55
53
|
case @cache_mode
|
56
54
|
when :compile_knj
|
57
55
|
@compiler.eval_file(:filepath => cachename, :fileident => filename)
|
@@ -63,9 +61,11 @@ class Knj::Eruby
|
|
63
61
|
binding_use = eruby_binding.get_binding
|
64
62
|
end
|
65
63
|
|
66
|
-
|
67
|
-
eval(
|
64
|
+
#No reason to cache contents of files - benchmarking showed little to no differene performance-wise, but caching took up a lot of memory, when a lot of files were cached - knj.
|
65
|
+
eval(File.read(cachename), binding_use, filename)
|
68
66
|
when :inseq
|
67
|
+
reload_cache = true if !@cache.key?(cachename)
|
68
|
+
|
69
69
|
if reload_cache or @cache[cachename][:time] < cachetime
|
70
70
|
@cache[cachename] = {
|
71
71
|
:inseq => RubyVM::InstructionSequence.compile(File.read(cachename), filename, nil, 1),
|
data/lib/knj/gtk2.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Knj::Gtk2
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
#Autoloader.
|
3
|
+
def self.const_missing(name)
|
4
|
+
require "#{$knjpath}knj/gtk2_#{name.to_s.downcase}"
|
5
|
+
return Knj::Gtk2.const_get(name)
|
6
|
+
end
|
6
7
|
|
7
8
|
def msgbox(p1, p2 = "warning", p3 = "Warning")
|
8
9
|
return Knj::Gtk2.msgbox(p1, p2, p3)
|
data/lib/knj/http2.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "#{$knjpath}web"
|
2
2
|
|
3
3
|
class Knj::Http2
|
4
|
-
attr_reader :cookies
|
4
|
+
attr_reader :cookies, :args
|
5
5
|
|
6
6
|
def initialize(args = {})
|
7
7
|
args = {:host => args} if args.is_a?(String)
|
@@ -362,7 +362,7 @@ class Knj::Http2
|
|
362
362
|
@resp = nil
|
363
363
|
@mode = nil
|
364
364
|
|
365
|
-
raise "No status-code was received from the server.\n\nHeaders:\n#{Knj::Php.print_r(resp.headers)}\n\nBody:\n#{resp.args[:body]}" if !resp.args[:code]
|
365
|
+
raise "No status-code was received from the server.\n\nHeaders:\n#{Knj::Php.print_r(resp.headers, true)}\n\nBody:\n#{resp.args[:body]}" if !resp.args[:code]
|
366
366
|
|
367
367
|
if resp.args[:code].to_s == "302" and resp.header?("location") and (!@args.key?(:follow_redirects) or @args[:follow_redirects])
|
368
368
|
uri = URI.parse(resp.header("location"))
|
Binary file
|
@@ -21,7 +21,7 @@ class KnjDB_sqlite3
|
|
21
21
|
if @knjdb.opts[:sqlite_driver]
|
22
22
|
require @knjdb.opts[:sqlite_driver]
|
23
23
|
else
|
24
|
-
require "#{File.dirname(__FILE__)}
|
24
|
+
require "#{File.dirname(__FILE__)}/../../../jruby/sqlitejdbc-v056.jar"
|
25
25
|
end
|
26
26
|
|
27
27
|
require "java"
|
@@ -45,7 +45,7 @@ class KnjDB_sqlite3
|
|
45
45
|
begin
|
46
46
|
return KnjDB_sqlite3_result_java.new(self, @stat.executeQuery(string))
|
47
47
|
rescue java.sql.SQLException => e
|
48
|
-
if e.message
|
48
|
+
if e.message.to_s.index("query does not return ResultSet") != nil
|
49
49
|
return KnjDB_sqlite3_result_java.new(self, nil)
|
50
50
|
else
|
51
51
|
raise e
|
data/lib/knj/knjdb/libknjdb.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
class Knj::Db
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
#Autoloader.
|
3
|
+
def self.const_missing(name)
|
4
|
+
require "#{$knjpath}knjdb/#{name.to_s.downcase}"
|
5
|
+
return Knj::Db.const_get(name)
|
5
6
|
end
|
6
7
|
|
7
8
|
attr_reader :opts, :conn, :conns, :int_types
|
@@ -178,7 +179,7 @@ class Knj::Db
|
|
178
179
|
end
|
179
180
|
|
180
181
|
def insert(tablename, arr_insert, args = {})
|
181
|
-
conn_exec do |driver|
|
182
|
+
self.conn_exec do |driver|
|
182
183
|
sql = "INSERT INTO #{driver.escape_table}#{tablename.to_s}#{driver.escape_table} ("
|
183
184
|
|
184
185
|
first = true
|
@@ -213,7 +214,7 @@ class Knj::Db
|
|
213
214
|
end
|
214
215
|
|
215
216
|
def insert_multi(tablename, arr_hashes)
|
216
|
-
conn_exec do |driver|
|
217
|
+
self.conn_exec do |driver|
|
217
218
|
if driver.respond_to?(:insert_multi)
|
218
219
|
return false if arr_hashes.empty?
|
219
220
|
driver.insert_multi(tablename, arr_hashes)
|
@@ -228,7 +229,7 @@ class Knj::Db
|
|
228
229
|
def update(tablename, arr_update, arr_terms = {})
|
229
230
|
return false if arr_update.empty?
|
230
231
|
|
231
|
-
conn_exec do |driver|
|
232
|
+
self.conn_exec do |driver|
|
232
233
|
sql = ""
|
233
234
|
sql << "UPDATE #{driver.escape_col}#{tablename.to_s}#{driver.escape_col} SET "
|
234
235
|
|
@@ -256,7 +257,7 @@ class Knj::Db
|
|
256
257
|
def select(tablename, arr_terms = nil, args = nil, &block)
|
257
258
|
sql = ""
|
258
259
|
|
259
|
-
conn_exec do |driver|
|
260
|
+
self.conn_exec do |driver|
|
260
261
|
sql = "SELECT * FROM #{driver.escape_table}#{tablename.to_s}#{driver.escape_table}"
|
261
262
|
|
262
263
|
if arr_terms != nil and !arr_terms.empty?
|
@@ -285,18 +286,21 @@ class Knj::Db
|
|
285
286
|
return self.q(sql, &block)
|
286
287
|
end
|
287
288
|
|
288
|
-
def selectsingle(tablename, arr_terms = nil, args = {})
|
289
|
-
args["limit"] = 1
|
290
|
-
return self.select(tablename, arr_terms, args).fetch
|
291
|
-
end
|
292
|
-
|
293
289
|
def single(tablename, arr_terms = nil, args = {})
|
294
290
|
args["limit"] = 1
|
295
|
-
|
291
|
+
|
292
|
+
#Experienced very weird memory leak if this was not done by block. Maybe bug in Ruby 1.9.2? - knj
|
293
|
+
self.select(tablename, arr_terms, args) do |data|
|
294
|
+
return data
|
295
|
+
end
|
296
|
+
|
297
|
+
return false
|
296
298
|
end
|
297
299
|
|
300
|
+
alias :selectsingle :single
|
301
|
+
|
298
302
|
def delete(tablename, arr_terms)
|
299
|
-
conn_exec do |driver|
|
303
|
+
self.conn_exec do |driver|
|
300
304
|
sql = "DELETE FROM #{driver.escape_table}#{tablename}#{driver.escape_table}"
|
301
305
|
|
302
306
|
if arr_terms != nil and !arr_terms.empty?
|
@@ -305,6 +309,8 @@ class Knj::Db
|
|
305
309
|
|
306
310
|
driver.query(sql)
|
307
311
|
end
|
312
|
+
|
313
|
+
return nil
|
308
314
|
end
|
309
315
|
|
310
316
|
def makeWhere(arr_terms, driver)
|
@@ -320,6 +326,8 @@ class Knj::Db
|
|
320
326
|
|
321
327
|
if value.is_a?(Array)
|
322
328
|
sql << "#{driver.escape_col}#{key}#{driver.escape_col} IN (#{Knj::ArrayExt.join(:arr => value, :sep => ",", :surr => "'", :callback => proc{|ele| self.esc(ele)})})"
|
329
|
+
elsif value.is_a?(Hash)
|
330
|
+
raise "Dont know how to handle hash."
|
323
331
|
else
|
324
332
|
sql << "#{driver.escape_col}#{key}#{driver.escape_col} = #{driver.escape_val}#{driver.escape(value)}#{driver.escape_val}"
|
325
333
|
end
|
@@ -540,7 +548,7 @@ class Knj::Db
|
|
540
548
|
end
|
541
549
|
|
542
550
|
def method_missing(method_name, *args)
|
543
|
-
conn_exec do |driver|
|
551
|
+
self.conn_exec do |driver|
|
544
552
|
if driver.respond_to?(method_name.to_sym)
|
545
553
|
return driver.send(method_name, *args)
|
546
554
|
end
|
data/lib/knj/php.rb
CHANGED
@@ -60,7 +60,7 @@ module Knj::Php
|
|
60
60
|
end
|
61
61
|
|
62
62
|
retstr << "[#{keystr}] => "
|
63
|
-
retstr << print_r(pair[1], true, count + 1).to_s
|
63
|
+
retstr << Knj::Php.print_r(pair[1], true, count + 1).to_s
|
64
64
|
end
|
65
65
|
|
66
66
|
i = 0
|
@@ -107,8 +107,8 @@ module Knj::Php
|
|
107
107
|
i_spaces += 1
|
108
108
|
end
|
109
109
|
|
110
|
-
retstr << "[
|
111
|
-
retstr << print_r(i, true, count + 1).to_s
|
110
|
+
retstr << "[#{arr_count}] => "
|
111
|
+
retstr << Knj::Php.print_r(i, true, count + 1).to_s
|
112
112
|
arr_count += 1
|
113
113
|
end
|
114
114
|
|
@@ -128,21 +128,21 @@ module Knj::Php
|
|
128
128
|
elsif argument.is_a?(Exception)
|
129
129
|
retstr << "#\{#{argument.class.to_s}: #{argument.message}}\n"
|
130
130
|
elsif cstr == "Knj::Unix_proc"
|
131
|
-
retstr << "#{argument.class.
|
132
|
-
retstr << print_r(argument.data, true, count).to_s
|
131
|
+
retstr << "#{argument.class.name}::data - "
|
132
|
+
retstr << Knj::Php.print_r(argument.data, true, count).to_s
|
133
133
|
elsif cstr == "Thread"
|
134
|
-
retstr << "#{argument.class.
|
134
|
+
retstr << "#{argument.class.name} - "
|
135
135
|
|
136
136
|
hash = {}
|
137
137
|
argument.keys.each do |key|
|
138
138
|
hash[key] = argument[key]
|
139
139
|
end
|
140
140
|
|
141
|
-
retstr << print_r(hash, true, count).to_s
|
141
|
+
retstr << Knj::Php.print_r(hash, true, count).to_s
|
142
142
|
elsif cstr == "Class"
|
143
143
|
retstr << "#{argument.class.to_s} - "
|
144
144
|
hash = {"name" => argument.name}
|
145
|
-
retstr << print_r(hash, true, count).to_s
|
145
|
+
retstr << Knj::Php.print_r(hash, true, count).to_s
|
146
146
|
elsif cstr == "URI::Generic"
|
147
147
|
retstr << "#{argument.class.to_s}{\n"
|
148
148
|
methods = [:host, :port, :scheme, :path]
|
@@ -972,10 +972,5 @@ module Knj::Php
|
|
972
972
|
return PHP.unserialize(argument.to_s)
|
973
973
|
end
|
974
974
|
|
975
|
-
@methods = instance_methods
|
976
|
-
def self.php_list_defined_methods
|
977
|
-
return @methods
|
978
|
-
end
|
979
|
-
|
980
975
|
module_function(*instance_methods)
|
981
976
|
end
|
data/lib/knj/process.rb
CHANGED
@@ -128,25 +128,39 @@ class Knj::Process
|
|
128
128
|
@on_rec.call(result_obj) do |answer_block|
|
129
129
|
$stderr.print "Running enum-block for #{answer_block}\n" if @debug
|
130
130
|
|
131
|
+
#Block has ended on hosts side - break out of block-loop.
|
131
132
|
break if !@blocks_send.key?(id)
|
133
|
+
|
134
|
+
#Throw the result at the block running.
|
132
135
|
y << answer_block
|
136
|
+
|
137
|
+
#This is to prevent the block-loop from running again, until host has confirmed it wants another result.
|
133
138
|
dobreak = false
|
134
139
|
|
135
140
|
loop do
|
141
|
+
#Block has ended on hosts-side - break of out block-loop.
|
136
142
|
if !@blocks_send.key?(id)
|
137
143
|
dobreak = true
|
138
144
|
break
|
139
145
|
end
|
140
146
|
|
141
|
-
|
147
|
+
#If waiting for result then release the loop and return another result.
|
148
|
+
if @blocks_send[id][:waiting_for_result]
|
149
|
+
@blocks_send[id][:waiting_for_result] = false
|
150
|
+
break
|
151
|
+
end
|
152
|
+
|
153
|
+
#Wait a little with checking for another result to not use 100% CPU.
|
142
154
|
sleep 0.01
|
143
155
|
end
|
144
156
|
|
157
|
+
#The block-loop should not run again - it has been prematurely interrupted on the host-side.
|
145
158
|
break if dobreak
|
146
159
|
end
|
147
160
|
end
|
148
161
|
when "send_block_res"
|
149
162
|
begin
|
163
|
+
#The host wants another result. Set the 'waiting-for-result' and wait for the enumerator to run. Then return result from enumerator (code is right above here).
|
150
164
|
@blocks_send[obj][:waiting_for_result] = true
|
151
165
|
res = @blocks_send[obj][:enum].next
|
152
166
|
self.answer(id, {"result" => res})
|
@@ -167,29 +181,38 @@ class Knj::Process
|
|
167
181
|
|
168
182
|
self.answer(id, "ok")
|
169
183
|
when "send_block_buffer"
|
170
|
-
buffer_use = true
|
171
|
-
|
172
184
|
Knj::Thread.new do
|
185
|
+
mutex = Mutex.new #Protecting 'buffer_answers'-variable. Crashing JRuby...
|
173
186
|
result_obj = Knj::Process::Resultobject.new(:process => self, :id => id, :obj => obj)
|
174
187
|
block_res = nil
|
188
|
+
buffer_done = false
|
175
189
|
|
176
190
|
begin
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
191
|
+
buffer_answers = []
|
192
|
+
|
193
|
+
buffer_thread = Knj::Thread.new do
|
194
|
+
dobreak = false
|
195
|
+
loop do
|
196
|
+
arr = nil
|
197
|
+
mutex.synchronize do
|
183
198
|
arr = buffer_answers.shift(200)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
199
|
+
end
|
200
|
+
|
201
|
+
if !arr.empty?
|
202
|
+
$stderr.print "Sending: #{arr.length} results.\n" if @debug
|
203
|
+
self.answer(id, arr, "answer_block")
|
204
|
+
else
|
205
|
+
$stderr.print "Waiting for buffer-stuff (#{arr.length}, #{buffer_done}).\n" if @debug
|
206
|
+
sleep 0.05
|
207
|
+
end
|
208
|
+
|
209
|
+
if buffer_done
|
210
|
+
mutex.synchronize do
|
211
|
+
$stderr.print "Buffer-answers: #{buffer_answers.length}, #{buffer_answers.empty?}\n" if @debug
|
212
|
+
dobreak = true if buffer_answers.empty? #since a break will not affect the real loop in Mutex#synchronize set this variable.
|
190
213
|
end
|
191
214
|
|
192
|
-
break if
|
215
|
+
break if dobreak
|
193
216
|
end
|
194
217
|
end
|
195
218
|
end
|
@@ -198,22 +221,23 @@ class Knj::Process
|
|
198
221
|
begin
|
199
222
|
count = 0
|
200
223
|
block_res = @on_rec.call(result_obj) do |answer_block|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
224
|
+
loop do
|
225
|
+
len = nil
|
226
|
+
mutex.synchronize do
|
227
|
+
len = buffer_answers.length
|
228
|
+
end
|
229
|
+
|
230
|
+
if len > 1000
|
231
|
+
$stderr.print "Buffer is more than 1000 - sleeping and tries again in 0.05 sec.\n" if @debug
|
232
|
+
sleep 0.05
|
233
|
+
else
|
234
|
+
break
|
209
235
|
end
|
210
236
|
end
|
211
237
|
|
212
238
|
count += 1
|
213
|
-
|
239
|
+
mutex.synchronize do
|
214
240
|
buffer_answers << answer_block
|
215
|
-
else
|
216
|
-
self.answer(id, [answer_block], "answer_block")
|
217
241
|
end
|
218
242
|
|
219
243
|
if count >= 100
|
@@ -234,10 +258,10 @@ class Knj::Process
|
|
234
258
|
end
|
235
259
|
end
|
236
260
|
ensure
|
237
|
-
buffer_done = true
|
261
|
+
buffer_done = true
|
238
262
|
end
|
239
263
|
ensure
|
240
|
-
buffer_thread.join
|
264
|
+
buffer_thread.join
|
241
265
|
end
|
242
266
|
rescue Exception => e
|
243
267
|
$stderr.print Knj::Errors.error_str(e) if @debug
|
data/lib/knj/process_meta.rb
CHANGED
@@ -394,7 +394,7 @@ class Knj::Process_meta::Proxy_obj
|
|
394
394
|
|
395
395
|
def initialize(args)
|
396
396
|
@args = args
|
397
|
-
@
|
397
|
+
@_process_meta_block_buffer_use = false
|
398
398
|
ObjectSpace.define_finalizer(self, @args[:process_meta].method(:proxy_finalizer))
|
399
399
|
end
|
400
400
|
|
@@ -538,9 +538,13 @@ class Knj::Process_meta::Proxy_obj::Buffered_caller
|
|
538
538
|
self._pm_flush
|
539
539
|
|
540
540
|
if @args[:async]
|
541
|
+
threads_remove = []
|
541
542
|
@threads.each do |thread|
|
542
543
|
thread.join
|
544
|
+
threads_remove << thread
|
543
545
|
end
|
546
|
+
|
547
|
+
@threads -= threads_remove
|
544
548
|
end
|
545
549
|
|
546
550
|
raise @raise_error if @raise_error
|
@@ -354,7 +354,7 @@ end
|
|
354
354
|
|
355
355
|
funcs_skip = [:foreach]
|
356
356
|
funcs_remove = [:session_start]
|
357
|
-
funcs_all = funcs_skip | Knj::Php.
|
357
|
+
funcs_all = funcs_skip | Knj::Php.instance_methods
|
358
358
|
|
359
359
|
funcs_all.each do |method_name|
|
360
360
|
next if funcs_skip.index(method_name) != nil
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#Copied from Headius: https://github.com/headius/thread_safe. Not just bundeled because I would like to make changes later...
|
2
|
+
#Minor modifications from Headius's original lib like submoduled, lower-case-safe and more...
|
3
|
+
|
4
|
+
if defined?(JRUBY_VERSION)
|
5
|
+
require "jruby/synchronized"
|
6
|
+
|
7
|
+
module Knj::Threadsafe
|
8
|
+
# A thread-safe subclass of Array. This version locks
|
9
|
+
# against the object itself for every method call,
|
10
|
+
# ensuring only one thread can be reading or writing
|
11
|
+
# at a time. This includes iteration methods like
|
12
|
+
# #each.
|
13
|
+
class Array < ::Array
|
14
|
+
include JRuby::Synchronized
|
15
|
+
end
|
16
|
+
|
17
|
+
# A thread-safe subclass of Hash. This version locks
|
18
|
+
# against the object itself for every method call,
|
19
|
+
# ensuring only one thread can be reading or writing
|
20
|
+
# at a time. This includes iteration methods like
|
21
|
+
# #each.
|
22
|
+
class Hash < ::Hash
|
23
|
+
include JRuby::Synchronized
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
# Because MRI never runs code in parallel, the existing
|
28
|
+
# non-thread-safe structures should usually work fine.
|
29
|
+
module Knj::ThreadSafe
|
30
|
+
Array = ::Array
|
31
|
+
Hash = ::Hash
|
32
|
+
end
|
33
|
+
end
|
data/lib/knj/win.rb
CHANGED
data/lib/knj/wref.rb
CHANGED
data/spec/amixer_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Amixer" do
|
4
4
|
it "should load by using autoload" do
|
5
5
|
require "knjrbfw"
|
6
|
-
require "knj/autoload"
|
7
6
|
|
8
7
|
$amixer = Knj::Amixer.new
|
9
8
|
end
|
@@ -20,6 +19,7 @@ describe "Amixer" do
|
|
20
19
|
mixers.each do |name, mixer|
|
21
20
|
next if !mixer.volume?
|
22
21
|
mixer.vol_add -5
|
22
|
+
mixer.vol_add 3
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
data/spec/db_spec.rb
CHANGED
@@ -8,7 +8,8 @@ describe "Db" do
|
|
8
8
|
|
9
9
|
require "knj/db"
|
10
10
|
require "knj/os"
|
11
|
-
require "
|
11
|
+
require "rubygems"
|
12
|
+
require "sqlite3" if !Kernel.const_defined?("SQLite3") and RUBY_ENGINE != "jruby"
|
12
13
|
|
13
14
|
db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
14
15
|
File.unlink(db_path) if File.exists?(db_path)
|
@@ -27,6 +28,15 @@ describe "Db" do
|
|
27
28
|
]
|
28
29
|
})
|
29
30
|
|
31
|
+
|
32
|
+
|
33
|
+
#Get a list of tables and check the list for errors.
|
34
|
+
list = db.tables.list
|
35
|
+
raise "Table not found: 'test'." if !list.key?("test")
|
36
|
+
raise "Table-name expected to be 'test' but wasnt: '#{list["test"].name}'." if list["test"].name != "test"
|
37
|
+
|
38
|
+
|
39
|
+
#Test revision to create tables.
|
30
40
|
schema = {
|
31
41
|
"tables" => {
|
32
42
|
"test_table" => {
|
data/spec/http2_spec.rb
CHANGED
@@ -49,7 +49,7 @@ describe "Http2" do
|
|
49
49
|
]
|
50
50
|
urls = ["robots.txt"]
|
51
51
|
|
52
|
-
http = Knj::Http2.new(:host => "www.partyworm.dk", :debug =>
|
52
|
+
http = Knj::Http2.new(:host => "www.partyworm.dk", :debug => false)
|
53
53
|
0.upto(105) do |count|
|
54
54
|
url = urls[rand(urls.size)]
|
55
55
|
#print "Doing request #{count} of 200 (#{url}).\n"
|
data/spec/knjrbfw_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe "Knjrbfw" do
|
4
4
|
it "should be able to generate a sample SQLite database and add a sample table, with sample columns and with a sample index to it" do
|
5
5
|
require "knjrbfw"
|
6
|
-
require "sqlite3"
|
6
|
+
require "sqlite3" if RUBY_ENGINE != "jruby"
|
7
7
|
|
8
8
|
db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
9
9
|
|
@@ -193,7 +193,7 @@ describe "Knjrbfw" do
|
|
193
193
|
end
|
194
194
|
|
195
195
|
it "should delete the temp database again." do
|
196
|
-
db_path = "#{
|
196
|
+
db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
|
197
197
|
File.unlink(db_path) if File.exists?(db_path)
|
198
198
|
end
|
199
199
|
|
@@ -296,7 +296,8 @@ describe "Knjrbfw" do
|
|
296
296
|
end
|
297
297
|
|
298
298
|
it "should be able to draw rounded transparent corners on images." do
|
299
|
-
require "
|
299
|
+
require "rubygems"
|
300
|
+
require "RMagick"
|
300
301
|
|
301
302
|
pic = Magick::Image.read("#{File.dirname(__FILE__)}/../testfiles/image.jpg").first
|
302
303
|
pic.format = "png"
|
data/spec/process_meta_spec.rb
CHANGED
@@ -2,10 +2,11 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe "Process_meta" do
|
4
4
|
it "should be able to start a server and a client" do
|
5
|
-
require "knj/
|
5
|
+
require "knj/process_meta"
|
6
|
+
require "timeout"
|
6
7
|
|
7
8
|
#Start the activity.
|
8
|
-
$process_meta = Knj::Process_meta.new("debug" => false, "debug_err" => true)
|
9
|
+
$process_meta = Knj::Process_meta.new("debug" => false, "debug_err" => true, "id" => "process_meta_spec")
|
9
10
|
end
|
10
11
|
|
11
12
|
it "should be able to do various operations" do
|
@@ -37,15 +38,13 @@ describe "Process_meta" do
|
|
37
38
|
$ids << proxy_obj3.__id__
|
38
39
|
|
39
40
|
proxy_obj.test_block do |i|
|
40
|
-
if i == 5
|
41
|
-
break
|
42
|
-
end
|
41
|
+
break if i == 5
|
43
42
|
end
|
44
43
|
|
45
44
|
last_num = proxy_obj.last_num
|
46
45
|
raise "Expected last num to be 5 but it wasnt: '#{last_num}'." if last_num != 5
|
47
46
|
|
48
|
-
#Somehow define_finalizer is always one behind, so we have to do funny one here.
|
47
|
+
#Somehow define_finalizer is always one behind, so we have to do another funny one here.
|
49
48
|
ObjectSpace.define_finalizer(self, $process_meta.method(:proxy_finalizer))
|
50
49
|
end
|
51
50
|
|
@@ -74,14 +73,16 @@ describe "Process_meta" do
|
|
74
73
|
|
75
74
|
#Do a lot of calls at the same time to test thread-safety.
|
76
75
|
threads = []
|
77
|
-
0.upto(10) do |
|
78
|
-
should_return = "Kasper".slice(0,
|
79
|
-
|
80
|
-
0.upto(500) do
|
81
|
-
res = proxy_obj.slice(0,
|
76
|
+
0.upto(10) do |thread_i|
|
77
|
+
should_return = "Kasper".slice(0, thread_i)
|
78
|
+
thread = Knj::Thread.new do
|
79
|
+
0.upto(500) do |num_i|
|
80
|
+
res = proxy_obj.slice(0, thread_i)
|
82
81
|
raise "Should return: '#{should_return}' but didnt: '#{res}'." if res != should_return
|
83
82
|
end
|
84
83
|
end
|
84
|
+
|
85
|
+
threads << thread
|
85
86
|
end
|
86
87
|
|
87
88
|
threads.each do |thread|
|
@@ -99,19 +100,24 @@ describe "Process_meta" do
|
|
99
100
|
end
|
100
101
|
|
101
102
|
#Ensure the expected has actually been increased by running the block.
|
102
|
-
raise "Expected end-result of
|
103
|
+
raise "Expected end-result of 1001 but got: '#{expect}'." if expect != 1001
|
103
104
|
|
104
105
|
|
106
|
+
proxy_int = $process_meta.spawn_object(:Integer, nil, 5)
|
105
107
|
proxy_int._process_meta_block_buffer_use = true
|
106
108
|
expect = 5
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
|
110
|
+
#If this takes more than 10 secs - something is wrong (JRuby can take a long time)...
|
111
|
+
Timeout.timeout(10) do
|
112
|
+
proxy_int.upto(10000) do |i|
|
113
|
+
raise "Expected '#{expect}' but got: '#{i}'." if i != expect
|
114
|
+
expect += 1
|
115
|
+
end
|
110
116
|
end
|
111
117
|
|
112
118
|
|
113
119
|
#Ensure the expected has actually been increased by running the block.
|
114
|
-
raise "Expected end-result of
|
120
|
+
raise "Expected end-result of 10001 but got: '#{expect}'." if expect != 10001
|
115
121
|
|
116
122
|
#Try to unset an object.
|
117
123
|
proxy_obj._process_meta_unset
|
@@ -132,14 +138,14 @@ describe "Process_meta" do
|
|
132
138
|
nil
|
133
139
|
")
|
134
140
|
|
135
|
-
Timeout.timeout(
|
141
|
+
Timeout.timeout(10) do
|
136
142
|
expect = 8
|
137
143
|
$process_meta.static("Kaspertest", "kaspertest") do |count|
|
138
|
-
raise "Expected '#{expect}' but got: '#{count}'."
|
144
|
+
raise "Expected '#{expect}' but got: '#{count}'." if expect != count
|
139
145
|
expect += 1
|
140
146
|
end
|
141
147
|
|
142
|
-
raise "Expected '13' but got: '#{expect}'."
|
148
|
+
raise "Expected '13' but got: '#{expect}'." if expect != 13
|
143
149
|
end
|
144
150
|
end
|
145
151
|
|
data/spec/process_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe "Process" do
|
4
4
|
it "should be able to start a server and a client" do
|
5
|
-
require "
|
5
|
+
require "timeout"
|
6
6
|
|
7
7
|
tcp_server = TCPServer.new("0.0.0.0", 15678)
|
8
8
|
conn_client = TCPSocket.new("localhost", 15678)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knjrbfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.29
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-03 00:00:00.000000000 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
-
requirement: &
|
17
|
+
requirement: &20663780 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,21 +22,21 @@ dependencies:
|
|
22
22
|
version: 2.3.0
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *20663780
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: bundler
|
28
|
-
requirement: &
|
28
|
+
requirement: &20663120 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.0.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *20663120
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: jeweler
|
39
|
-
requirement: &
|
39
|
+
requirement: &20626880 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.6.3
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *20626880
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rcov
|
50
|
-
requirement: &
|
50
|
+
requirement: &20625900 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *20625900
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: sqlite3
|
61
|
-
requirement: &
|
61
|
+
requirement: &20624280 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *20624280
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rmagick
|
72
|
-
requirement: &
|
72
|
+
requirement: &20621140 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *20621140
|
81
81
|
description: Including stuff for HTTP, SSH and much more.
|
82
82
|
email: k@spernj.org
|
83
83
|
executables: []
|
@@ -225,6 +225,7 @@ files:
|
|
225
225
|
- lib/knj/jruby-gtk2/treeview.rb
|
226
226
|
- lib/knj/jruby-gtk2/vbox.rb
|
227
227
|
- lib/knj/jruby-gtk2/window.rb
|
228
|
+
- lib/knj/jruby/sqlitejdbc-v056.jar
|
228
229
|
- lib/knj/jruby_compiler.rb
|
229
230
|
- lib/knj/knj.rb
|
230
231
|
- lib/knj/knj_controller.rb
|
@@ -302,6 +303,7 @@ files:
|
|
302
303
|
- lib/knj/thread2.rb
|
303
304
|
- lib/knj/threadhandler.rb
|
304
305
|
- lib/knj/threadpool.rb
|
306
|
+
- lib/knj/threadsafe.rb
|
305
307
|
- lib/knj/translations.rb
|
306
308
|
- lib/knj/unix_proc.rb
|
307
309
|
- lib/knj/web.rb
|
@@ -343,7 +345,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
343
345
|
version: '0'
|
344
346
|
segments:
|
345
347
|
- 0
|
346
|
-
hash:
|
348
|
+
hash: -1825671310375953872
|
347
349
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
348
350
|
none: false
|
349
351
|
requirements:
|