knjrbfw 0.0.28 → 0.0.29
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.
- 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:
|