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 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", "~> 1.0.0"
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.28
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.28"
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-04-27}
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>, ["~> 1.0.0"])
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>, ["~> 1.0.0"])
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>, ["~> 1.0.0"])
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"])
@@ -1,3 +1,3 @@
1
1
  require "rubygems"
2
- require File.dirname(__FILE__) + "/json_autoload"
2
+ require "#{File.dirname(__FILE__)}/json_autoload"
3
3
  require "facebooker"
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}" if !File.exists?(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
- @cache[cachename] = File.read(cachename) if reload_cache
67
- eval(@cache[cachename], binding_use, filename)
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
- autoload :Cb, "knj/gtk2_cb"
3
- autoload :Menu, "knj/gtk2_menu"
4
- autoload :StatusWindow, "knj/gtk2_statuswindow"
5
- autoload :Tv, "knj/gtk2_tv"
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__)}/../../sqlitejdbc-v056.jar"
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 == "java.sql.SQLException: query does not return ResultSet"
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
@@ -45,7 +45,7 @@ class KnjDB_sqlite3::Tables
45
45
  if block_given?
46
46
  yield(obj)
47
47
  else
48
- ret[d_tables[:Name]] = obj
48
+ ret[d_tables[:name]] = obj
49
49
  end
50
50
  end
51
51
  end
@@ -1,7 +1,8 @@
1
1
  class Knj::Db
2
- unless Kernel.const_defined?("Rho")
3
- autoload :Dbtime, "#{$knjpath}knjdb/dbtime.rb"
4
- autoload :Revision, "#{$knjpath}knjdb/revision.rb"
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
- return self.select(tablename, arr_terms, args).fetch
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
@@ -64,7 +64,7 @@ class Knj::Objects
64
64
  if val[1] == "asc"
65
65
  ordermode = " ASC"
66
66
  elsif val[1] == "desc"
67
- ordermode = "DESC"
67
+ ordermode = " DESC"
68
68
  end
69
69
 
70
70
  if val[0].is_a?(Array)
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 << "[" + arr_count.to_s + "] => "
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.to_s}::data - "
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.to_s} - "
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
- break if @blocks_send[id][:waiting_for_result]
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
- if buffer_use
178
- buffer_answers = []
179
- buffer_done = false
180
-
181
- buffer_thread = Knj::Thread.new do
182
- loop do
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
- if !arr.empty?
186
- $stderr.print "Sending: #{arr.length} results.\n" if @debug
187
- self.answer(id, arr, "answer_block")
188
- else
189
- sleep 0.05
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 buffer_done and buffer_answers.empty?
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
- if buffer_use
202
- loop do
203
- if buffer_answers.length > 1000
204
- $stderr.print "Buffer is more than 1000 - sleeping and tries again in 0.05 sec.\n" if @debug
205
- sleep 0.05
206
- else
207
- break
208
- end
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
- if buffer_use
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 if buffer_use
261
+ buffer_done = true
238
262
  end
239
263
  ensure
240
- buffer_thread.join if buffer_use
264
+ buffer_thread.join
241
265
  end
242
266
  rescue Exception => e
243
267
  $stderr.print Knj::Errors.error_str(e) if @debug
@@ -394,7 +394,7 @@ class Knj::Process_meta::Proxy_obj
394
394
 
395
395
  def initialize(args)
396
396
  @args = args
397
- @_process_meta_buffer_use = false
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.php_list_defined_methods
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
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "knj/autoload"
4
- include Knj
5
4
 
6
- dgs = Degulesider.new
5
+ dgs = Knj::Degulesider.new
7
6
  results = dgs.search(
8
7
  :where => "Engvej 3, 4970 Rødby"
9
8
  )
10
9
 
11
- Php.print_r(results)
10
+ Knj::Php.print_r(results)
@@ -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
@@ -1,4 +1,6 @@
1
1
  module Knj::Win
2
- autoload :Registry, $knjpath + "win_registry"
3
- autoload :TightVNC, $knjpath + "win_tightvnc"
2
+ #Autoloader.
3
+ def self.const_missing(name)
4
+ require "#{$knjpath}knj/win_#{name.to_s.downcase}"
5
+ end
4
6
  end
data/lib/knj/wref.rb CHANGED
@@ -6,6 +6,7 @@ class Knj::Wref
6
6
  @id = obj.__id__
7
7
 
8
8
  if RUBY_ENGINE == "jruby"
9
+ require "java"
9
10
  @weakref = java.lang.ref.WeakReference.new(obj)
10
11
  else
11
12
  @class_name = obj.class.name.to_sym
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 "sqlite3" if !Kernel.const_defined?("SQLite3")
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 => true)
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 = "#{Dir.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
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 "rmagick"
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"
@@ -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/autoload"
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 |i|
78
- should_return = "Kasper".slice(0, i)
79
- threads << Knj::Thread.new do
80
- 0.upto(500) do
81
- res = proxy_obj.slice(0, i)
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 11 but got: '#{expect}'." if expect != 1001
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
- proxy_int.upto(10000) do |i|
108
- raise "Expected '#{expect}' but got: '#{i}'." if i != expect
109
- expect += 1
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 11 but got: '#{expect}'." if expect != 10001
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(5) do
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 "knj/autoload"
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.28
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-04-27 00:00:00.000000000 +02:00
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: &15665000 !ruby/object:Gem::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: *15665000
25
+ version_requirements: *20663780
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &15664000 !ruby/object:Gem::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: *15664000
36
+ version_requirements: *20663120
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: jeweler
39
- requirement: &15663060 !ruby/object:Gem::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: *15663060
47
+ version_requirements: *20626880
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rcov
50
- requirement: &15656020 !ruby/object:Gem::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: *15656020
58
+ version_requirements: *20625900
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: sqlite3
61
- requirement: &15655380 !ruby/object:Gem::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: *15655380
69
+ version_requirements: *20624280
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rmagick
72
- requirement: &15654840 !ruby/object:Gem::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: *15654840
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: 894302943033086074
348
+ hash: -1825671310375953872
347
349
  required_rubygems_version: !ruby/object:Gem::Requirement
348
350
  none: false
349
351
  requirements: