knjrbfw 0.0.110 → 0.0.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +2 -2
- data/VERSION +1 -1
- data/knjrbfw.gemspec +8 -36
- data/lib/knj/autoload.rb +1 -2
- data/lib/knj/gtk2_window.rb +7 -7
- data/lib/knj/unix_proc.rb +35 -35
- metadata +33 -62
- data/lib/knj/db.rb +0 -1
- data/lib/knj/knjdb/dbtime.rb +0 -35
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +0 -604
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +0 -155
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +0 -69
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_sqlspecs.rb +0 -5
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +0 -443
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +0 -184
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +0 -177
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +0 -29
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_sqlspecs.rb +0 -5
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +0 -449
- data/lib/knj/knjdb/dump.rb +0 -122
- data/lib/knj/knjdb/idquery.rb +0 -109
- data/lib/knj/knjdb/libknjdb.rb +0 -797
- data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +0 -83
- data/lib/knj/knjdb/libknjdb_row.rb +0 -153
- data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +0 -69
- data/lib/knj/knjdb/query_buffer.rb +0 -87
- data/lib/knj/knjdb/revision.rb +0 -342
- data/lib/knj/knjdb/sqlspecs.rb +0 -5
- data/lib/knj/objects.rb +0 -957
- data/lib/knj/process.rb +0 -480
- data/lib/knj/process_meta.rb +0 -569
- data/spec/db_spec.rb +0 -282
- data/spec/db_spec_encoding_test_file.txt +0 -1
- data/spec/objects_spec.rb +0 -394
- data/spec/process_meta_spec.rb +0 -172
- data/spec/process_spec.rb +0 -115
data/lib/knj/process_meta.rb
DELETED
@@ -1,569 +0,0 @@
|
|
1
|
-
require "#{$knjpath}process"
|
2
|
-
require "#{$knjpath}os"
|
3
|
-
|
4
|
-
#This class can spawn another Ruby-process and manipulate it to create objects, evaluate code, create proxy-objects and other stuff in that process.
|
5
|
-
#===Examples
|
6
|
-
# This will create another Ruby-process, spawn an integer with the value of 5, run upto(10) and return each block to the current block. In the end the subprocess is terminated.
|
7
|
-
# Knj::Process_meta.new do |subproc|
|
8
|
-
# proxy_int = subproc.new(:Integer, 5)
|
9
|
-
# proxy_int.upto(10) do |i|
|
10
|
-
# print "Number: #{i}\n"
|
11
|
-
# end
|
12
|
-
# end
|
13
|
-
class Knj::Process_meta
|
14
|
-
attr_reader :process, :pid
|
15
|
-
|
16
|
-
#===Examples
|
17
|
-
#Knj::Process_meta.new("id" => "my_subproc") #Will make this ID be shown in the command, so you can recocknize it from "ps aux".
|
18
|
-
#Knj::Process_meta.new("exec_path" => "ruby1.9.1") #If you want a certain Ruby-command to be used when starting the subprocess, instead of detecting the current one.
|
19
|
-
#Knj::Process_meta.new("debug" => true, "debug_err" => true) #Enables various debug-messages to be printed.
|
20
|
-
def initialize(args = {})
|
21
|
-
@args = args
|
22
|
-
@objects = {}
|
23
|
-
|
24
|
-
#These variables are used to free memory in the subprocess, by using ObjectSpace#define_finalizer. The Mutex is the avoid problems when writing to the finalize-array multithreadded.
|
25
|
-
@finalize = []
|
26
|
-
@finalize_mutex = Mutex.new
|
27
|
-
|
28
|
-
if @args["exec_path"]
|
29
|
-
exec_path = @args["exec_path"]
|
30
|
-
else
|
31
|
-
exec_path = Knj::Os.executed_executable
|
32
|
-
end
|
33
|
-
|
34
|
-
exec_file = "#{File.dirname(__FILE__)}/scripts/process_meta_exec.rb"
|
35
|
-
|
36
|
-
if args["id"]
|
37
|
-
id = args["id"]
|
38
|
-
else
|
39
|
-
id = caller[0].to_s.strip
|
40
|
-
end
|
41
|
-
|
42
|
-
cmd = "#{exec_path} \"#{exec_file}\" #{Knj::Strings.unixsafe(id)}"
|
43
|
-
|
44
|
-
if RUBY_ENGINE == "jruby"
|
45
|
-
pid, @stdin, @stdout, @stderr = IO.popen4("#{exec_path} --#{RUBY_VERSION[0, 3]} \"#{exec_file}\" \"#{id}\"")
|
46
|
-
else
|
47
|
-
require "open3"
|
48
|
-
@stdin, @stdout, @stderr = Open3.popen3(cmd)
|
49
|
-
end
|
50
|
-
|
51
|
-
@stdout.sync = true
|
52
|
-
@stdin.sync = true
|
53
|
-
|
54
|
-
args = {
|
55
|
-
:out => @stdin,
|
56
|
-
:in => @stdout,
|
57
|
-
:listen => true,
|
58
|
-
:debug => @args["debug"]
|
59
|
-
}
|
60
|
-
|
61
|
-
if @args["debug"] or @args["debug_err"]
|
62
|
-
args[:err] = @stderr
|
63
|
-
args[:on_err] = proc{|line|
|
64
|
-
$stderr.print "stderr: #{line}"
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
#Wait for process to start and check that it is returning the expected output.
|
69
|
-
start_line = @stdout.gets
|
70
|
-
raise "Expected startline from process to be 'process_meta_started' but got: '#{start_line}'." if start_line != "process_meta_started\n"
|
71
|
-
|
72
|
-
@process = Knj::Process.new(args)
|
73
|
-
|
74
|
-
res = @process.send("obj" => {"type" => "process_data"})
|
75
|
-
raise "Unexpected process-data: '#{res}'." if !res.is_a?(Hash) or res["type"] != "process_data_success"
|
76
|
-
@pid = res["pid"]
|
77
|
-
|
78
|
-
#If block is given then run block and destroy self.
|
79
|
-
if block_given?
|
80
|
-
begin
|
81
|
-
yield(self)
|
82
|
-
ensure
|
83
|
-
self.destroy
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
#Finalizer for proxy-objects. Used for unsetting objects on the process-side.
|
89
|
-
def proxy_finalizer(id)
|
90
|
-
@finalize_mutex.synchronize do
|
91
|
-
@finalize << id
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
#Flushes all finalized objects on the process-side.
|
96
|
-
def check_finalizers
|
97
|
-
return nil if @finalize.empty?
|
98
|
-
|
99
|
-
finalize = nil
|
100
|
-
@finalize_mutex.synchronize do
|
101
|
-
finalize = @finalize
|
102
|
-
@finalize = []
|
103
|
-
|
104
|
-
begin
|
105
|
-
@process.send("obj" => {
|
106
|
-
"type" => "unset_multiple",
|
107
|
-
"var_names" => finalize
|
108
|
-
})
|
109
|
-
rescue => e
|
110
|
-
if e.message.to_s.index("Var-name didnt exist when trying to unset:")
|
111
|
-
#ignore.
|
112
|
-
else
|
113
|
-
raise e
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
#Parses the arguments given. Proxy-object-arguments will be their natural objects in the subprocess.
|
120
|
-
def self.args_parse(args)
|
121
|
-
if args.is_a?(Array)
|
122
|
-
newargs = []
|
123
|
-
args.each do |val|
|
124
|
-
if val.is_a?(Knj::Process_meta::Proxy_obj)
|
125
|
-
newargs << {"type" => "proxy_obj", "var_name" => val._process_meta_args[:name]}
|
126
|
-
else
|
127
|
-
newargs << Knj::Process_meta.args_parse(val)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
return newargs
|
132
|
-
elsif args.is_a?(Hash)
|
133
|
-
newargs = {}
|
134
|
-
args.each do |key, val|
|
135
|
-
if key.is_a?(Knj::Process_meta::Proxy_obj)
|
136
|
-
key = {"type" => "proxy_obj", "var_name" => key._process_meta_args[:name]}
|
137
|
-
else
|
138
|
-
key = Knj::Process_meta.args_parse(key)
|
139
|
-
end
|
140
|
-
|
141
|
-
if val.is_a?(Knj::Process_meta::Proxy_obj)
|
142
|
-
val = {"type" => "proxy_obj", "var_name" => val._process_meta_args[:name]}
|
143
|
-
else
|
144
|
-
val = Knj::Process_meta.args_parse(val)
|
145
|
-
end
|
146
|
-
|
147
|
-
newargs[key] = val
|
148
|
-
end
|
149
|
-
|
150
|
-
return newargs
|
151
|
-
else
|
152
|
-
return args
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
#Parses the special hashes to reflect the natural objects instead of proxy-objects.
|
157
|
-
def self.args_parse_back(args, objects)
|
158
|
-
if args.is_a?(Array)
|
159
|
-
newargs = []
|
160
|
-
args.each do |val|
|
161
|
-
newargs << Knj::Process_meta.args_parse_back(val, objects)
|
162
|
-
end
|
163
|
-
|
164
|
-
return newargs
|
165
|
-
elsif args.is_a?(Hash) and args["type"] == "proxy_obj" and args.key?("var_name")
|
166
|
-
raise "No object by that var-name: '#{args["var_name"]}' in '#{objects}'." if !objects.key?(args["var_name"])
|
167
|
-
return objects[args["var_name"]]
|
168
|
-
elsif args.is_a?(Hash)
|
169
|
-
newargs = {}
|
170
|
-
args.each do |key, val|
|
171
|
-
newargs[Knj::Process_meta.args_parse_back(key, objects)] = Knj::Process_meta.args_parse_back(val, objects)
|
172
|
-
end
|
173
|
-
|
174
|
-
return newargs
|
175
|
-
else
|
176
|
-
return args
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
#Executes a static call in the subprocess but does not capture or return the result. Useful if the static method returns an object that would load a library after being un-marshaled.
|
181
|
-
def static_noret(const, method_name, *args, &block)
|
182
|
-
res = @process.send(
|
183
|
-
"obj" => {
|
184
|
-
"type" => "static",
|
185
|
-
"const" => const,
|
186
|
-
"method_name" => method_name,
|
187
|
-
"capture_return" => false,
|
188
|
-
"args" => Knj::Process_meta.args_parse(args),
|
189
|
-
},
|
190
|
-
&block
|
191
|
-
)
|
192
|
-
|
193
|
-
return res["result"] if res["type"] == "call_const_success"
|
194
|
-
raise "Unknown result: '#{res}'."
|
195
|
-
end
|
196
|
-
|
197
|
-
#Executes a static method on a class in the sub-process.
|
198
|
-
def static(const, method_name, *args, &block)
|
199
|
-
res = @process.send(
|
200
|
-
"obj" => {
|
201
|
-
"type" => "static",
|
202
|
-
"const" => const,
|
203
|
-
"method_name" => method_name,
|
204
|
-
"capture_return" => true,
|
205
|
-
"args" => Knj::Process_meta.args_parse(args),
|
206
|
-
},
|
207
|
-
&block
|
208
|
-
)
|
209
|
-
|
210
|
-
return res["result"] if res["type"] == "call_const_success"
|
211
|
-
raise "Unknown result: '#{res}'."
|
212
|
-
end
|
213
|
-
|
214
|
-
#Spawns a new object in the subprocess by that classname, with those arguments and with that block.
|
215
|
-
def new(class_name, *args, &block)
|
216
|
-
#We need to check finalizers first, so we wont accidently reuse an ID, which will then be unset in the process.
|
217
|
-
self.check_finalizers
|
218
|
-
|
219
|
-
#Spawn and return the object.
|
220
|
-
return self.spawn_object(class_name, nil, *args, &block)
|
221
|
-
end
|
222
|
-
|
223
|
-
#Spawns a new object in the subprocess and returns a proxy-variable for that subprocess-object.
|
224
|
-
def spawn_object(class_name, var_name = nil, *args, &block)
|
225
|
-
proxy_obj = Knj::Process_meta::Proxy_obj.new(:process_meta => self, :name => var_name)
|
226
|
-
|
227
|
-
if var_name == nil
|
228
|
-
var_name = proxy_obj.__id__
|
229
|
-
proxy_obj._process_meta_args[:name] = var_name
|
230
|
-
end
|
231
|
-
|
232
|
-
res = @process.send(
|
233
|
-
{
|
234
|
-
"obj" => {
|
235
|
-
"type" => "spawn_object",
|
236
|
-
"class_name" => class_name,
|
237
|
-
"var_name" => var_name,
|
238
|
-
"args" => Knj::Process_meta.args_parse(args)
|
239
|
-
}
|
240
|
-
},
|
241
|
-
&block
|
242
|
-
)
|
243
|
-
|
244
|
-
return proxy_obj
|
245
|
-
end
|
246
|
-
|
247
|
-
#Evaluates a string in the sub-process.
|
248
|
-
def str_eval(str)
|
249
|
-
res = @process.send("obj" => {
|
250
|
-
"type" => "str_eval",
|
251
|
-
"str" => str
|
252
|
-
})
|
253
|
-
|
254
|
-
return res["result"] if res.is_a?(Hash) and res["type"] == "call_eval_success"
|
255
|
-
return "Unknown result: '#{res}'."
|
256
|
-
end
|
257
|
-
|
258
|
-
#Calls a method on an object and returns the result.
|
259
|
-
def call_object(args, &block)
|
260
|
-
if args.key?("capture_return")
|
261
|
-
capture_return = args["capture_return"]
|
262
|
-
else
|
263
|
-
capture_return = true
|
264
|
-
end
|
265
|
-
|
266
|
-
if args["buffered"]
|
267
|
-
type = "call_object_buffered"
|
268
|
-
else
|
269
|
-
type = "call_object_block"
|
270
|
-
end
|
271
|
-
|
272
|
-
res = @process.send(
|
273
|
-
{
|
274
|
-
"buffer_use" => args["buffer_use"],
|
275
|
-
"obj" => {
|
276
|
-
"type" => type,
|
277
|
-
"var_name" => args["var_name"],
|
278
|
-
"method_name" => args["method_name"],
|
279
|
-
"capture_return" => capture_return,
|
280
|
-
"args" => Knj::Process_meta.args_parse(args["args"])
|
281
|
-
}
|
282
|
-
},
|
283
|
-
&block
|
284
|
-
)
|
285
|
-
|
286
|
-
return res["result"] if res.is_a?(Hash) and res["type"] == "call_object_success"
|
287
|
-
raise "Unknown result: '#{res}'."
|
288
|
-
end
|
289
|
-
|
290
|
-
def proxy_from_eval(eval_str)
|
291
|
-
proxy_obj = Knj::Process_meta::Proxy_obj.new(:process_meta => self)
|
292
|
-
var_name = proxy_obj.__id__
|
293
|
-
proxy_obj._process_meta_args[:name] = var_name
|
294
|
-
|
295
|
-
res = @process.send(
|
296
|
-
"obj" => {
|
297
|
-
"type" => "proxy_from_eval",
|
298
|
-
"str" => eval_str,
|
299
|
-
"var_name" => var_name
|
300
|
-
}
|
301
|
-
)
|
302
|
-
|
303
|
-
return proxy_obj
|
304
|
-
end
|
305
|
-
|
306
|
-
def proxy_from_static(class_name, method_name, *args)
|
307
|
-
proxy_obj = Knj::Process_meta::Proxy_obj.new(:process_meta => self)
|
308
|
-
var_name = proxy_obj.__id__
|
309
|
-
proxy_obj._process_meta_args[:name] = var_name
|
310
|
-
|
311
|
-
res = @process.send(
|
312
|
-
"obj" => {
|
313
|
-
"type" => "proxy_from_static",
|
314
|
-
"const" => class_name,
|
315
|
-
"method_name" => method_name,
|
316
|
-
"var_name" => var_name,
|
317
|
-
"args" => Knj::Process_meta.args_parse(args)
|
318
|
-
}
|
319
|
-
)
|
320
|
-
|
321
|
-
return proxy_obj
|
322
|
-
end
|
323
|
-
|
324
|
-
#Returns a proxy-object to a object given from a call.
|
325
|
-
def proxy_from_call(proxy_obj_to_call, method_name, *args)
|
326
|
-
proxy_obj = Knj::Process_meta::Proxy_obj.new(:process_meta => self)
|
327
|
-
var_name = proxy_obj.__id__
|
328
|
-
proxy_obj._process_meta_args[:name] = var_name
|
329
|
-
|
330
|
-
res = @process.send(
|
331
|
-
"obj" => {
|
332
|
-
"type" => "proxy_from_call",
|
333
|
-
"proxy_obj" => proxy_obj_to_call.__id__,
|
334
|
-
"method_name" => method_name,
|
335
|
-
"var_name" => var_name,
|
336
|
-
"args" => Knj::Process_meta.args_parse(args)
|
337
|
-
}
|
338
|
-
)
|
339
|
-
|
340
|
-
return proxy_obj
|
341
|
-
end
|
342
|
-
|
343
|
-
#Returns true if the given name exists in the subprocess-objects-hash.
|
344
|
-
def proxy_has?(var_name)
|
345
|
-
self.check_finalizers
|
346
|
-
|
347
|
-
begin
|
348
|
-
res = @process.send(
|
349
|
-
"obj" => {
|
350
|
-
"type" => "call_object_block",
|
351
|
-
"var_name" => var_name,
|
352
|
-
"method_name" => "__id__",
|
353
|
-
"args" => []
|
354
|
-
}
|
355
|
-
)
|
356
|
-
rescue => e
|
357
|
-
return false if e.message.to_s.match(/^No object by that name/)
|
358
|
-
raise e
|
359
|
-
end
|
360
|
-
|
361
|
-
return true
|
362
|
-
end
|
363
|
-
|
364
|
-
#Destroyes the project and unsets all variables on the Process_meta-object.
|
365
|
-
def destroy
|
366
|
-
@process.send("obj" => {"type" => "exit"})
|
367
|
-
@err_thread.kill if @err_thread
|
368
|
-
@process.destroy
|
369
|
-
|
370
|
-
begin
|
371
|
-
Process.kill("TERM", @pid)
|
372
|
-
rescue Errno::ESRCH
|
373
|
-
#Process is already dead - ignore.
|
374
|
-
end
|
375
|
-
|
376
|
-
begin
|
377
|
-
sleep 0.1
|
378
|
-
process_exists = Knj::Unix_proc.list("pids" => [@pid])
|
379
|
-
raise "Process exists." if !process_exists.empty?
|
380
|
-
rescue => e
|
381
|
-
raise e if e.message != "Process exists."
|
382
|
-
|
383
|
-
begin
|
384
|
-
Process.kill(9, pid) if process_exists
|
385
|
-
rescue Errno::ESRCH => e
|
386
|
-
raise e if e.message.index("No such process") == nil
|
387
|
-
end
|
388
|
-
|
389
|
-
#$stderr.print "Try to kill again...\n"
|
390
|
-
#retry
|
391
|
-
end
|
392
|
-
|
393
|
-
@process = nil
|
394
|
-
@stdin = nil
|
395
|
-
@stdout = nil
|
396
|
-
@stderr = nil
|
397
|
-
@objects = nil
|
398
|
-
@args = nil
|
399
|
-
end
|
400
|
-
end
|
401
|
-
|
402
|
-
#This proxies all events to the sub-process.
|
403
|
-
class Knj::Process_meta::Proxy_obj
|
404
|
-
#Overwrite internal methods some truly simulate the sub-process-methods.
|
405
|
-
proxy_methods = ["to_s", "respond_to?"]
|
406
|
-
proxy_methods.each do |method_name|
|
407
|
-
define_method(method_name) do |*args|
|
408
|
-
return self.method_missing(method_name, *args)
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
|
-
def initialize(args)
|
413
|
-
@args = args
|
414
|
-
@_process_meta_block_buffer_use = false
|
415
|
-
ObjectSpace.define_finalizer(self, @args[:process_meta].method(:proxy_finalizer))
|
416
|
-
end
|
417
|
-
|
418
|
-
#This proxies all method-calls through the process-handeler and returns the result as the object was precent inside the current process-memory, even though it is not.
|
419
|
-
def method_missing(method_name, *args, &block)
|
420
|
-
raise "No arguments on the object?" if !@args
|
421
|
-
@args[:process_meta].call_object(
|
422
|
-
{
|
423
|
-
"var_name" => @args[:name],
|
424
|
-
"method_name" => method_name,
|
425
|
-
"args" => args,
|
426
|
-
"buffer_use" => @_process_meta_block_buffer_use
|
427
|
-
},
|
428
|
-
&block
|
429
|
-
)
|
430
|
-
end
|
431
|
-
|
432
|
-
def _process_meta_unset
|
433
|
-
@args[:process_meta].process.send("obj" => {"type" => "unset", "var_name" => @args[:name]})
|
434
|
-
end
|
435
|
-
|
436
|
-
def _process_meta_args
|
437
|
-
return @args
|
438
|
-
end
|
439
|
-
|
440
|
-
def _process_meta_block_buffer_use=(newval)
|
441
|
-
@_process_meta_block_buffer_use = newval
|
442
|
-
end
|
443
|
-
|
444
|
-
def _pm_send_noret(method_name, *args, &block)
|
445
|
-
@args[:process_meta].call_object(
|
446
|
-
{
|
447
|
-
"var_name" => @args[:name],
|
448
|
-
"method_name" => method_name,
|
449
|
-
"args" => args,
|
450
|
-
"buffer_use" => @_process_meta_block_buffer_use,
|
451
|
-
"capture_return" => false
|
452
|
-
},
|
453
|
-
&block
|
454
|
-
)
|
455
|
-
end
|
456
|
-
|
457
|
-
def _pm_buffered_caller(args)
|
458
|
-
return Knj::Process_meta::Proxy_obj::Buffered_caller.new({
|
459
|
-
:name => @args[:name],
|
460
|
-
:process_meta => @args[:process_meta]
|
461
|
-
}.merge(args))
|
462
|
-
end
|
463
|
-
end
|
464
|
-
|
465
|
-
class Knj::Process_meta::Proxy_obj::Buffered_caller
|
466
|
-
def initialize(args)
|
467
|
-
@args = args
|
468
|
-
@buffer = []
|
469
|
-
@mutex = Mutex.new
|
470
|
-
@mutex_write = Mutex.new
|
471
|
-
@count = 0
|
472
|
-
@debug = @args[:debug] if @args[:debug]
|
473
|
-
|
474
|
-
if @args[:count_to]
|
475
|
-
@count_to = @args[:count_to]
|
476
|
-
else
|
477
|
-
@count_to = 1000
|
478
|
-
end
|
479
|
-
|
480
|
-
@buffer_max = @count_to * 2
|
481
|
-
@threads = [] if @args[:async]
|
482
|
-
end
|
483
|
-
|
484
|
-
def method_missing(method_name, *args)
|
485
|
-
if method_name.to_s == @args[:method_name].to_s
|
486
|
-
self._pm_call(*args)
|
487
|
-
else
|
488
|
-
raise NoMethodError, "No such method: '#{method_name}'."
|
489
|
-
end
|
490
|
-
end
|
491
|
-
|
492
|
-
def _pm_call(*args)
|
493
|
-
raise @raise_error if @raise_error
|
494
|
-
|
495
|
-
@mutex.synchronize do
|
496
|
-
while @count >= @count_to and @buffer.length >= @buffer_max
|
497
|
-
STDOUT.print "Waiting for write to complete...\n" if @debug
|
498
|
-
sleep 0.1
|
499
|
-
end
|
500
|
-
|
501
|
-
STDOUT.print "Adding to buffer #{@buffer.length}...\n" if @debug
|
502
|
-
@buffer << args
|
503
|
-
@count += 1
|
504
|
-
end
|
505
|
-
|
506
|
-
self._pm_flush if @count >= @count_to and !@writing
|
507
|
-
return nil
|
508
|
-
end
|
509
|
-
|
510
|
-
def _pm_flush(*args)
|
511
|
-
raise @raise_error if @raise_error
|
512
|
-
|
513
|
-
buffer = nil
|
514
|
-
@mutex.synchronize do
|
515
|
-
buffer = @buffer
|
516
|
-
@buffer = []
|
517
|
-
@count = 0
|
518
|
-
end
|
519
|
-
|
520
|
-
if @args[:async]
|
521
|
-
begin
|
522
|
-
@threads << Thread.new do
|
523
|
-
self._pm_flush_real(buffer)
|
524
|
-
end
|
525
|
-
rescue => e
|
526
|
-
@raise_error = e
|
527
|
-
end
|
528
|
-
|
529
|
-
return nil
|
530
|
-
else
|
531
|
-
return self._pm_flush_real(buffer)
|
532
|
-
end
|
533
|
-
end
|
534
|
-
|
535
|
-
def _pm_flush_real(buffer)
|
536
|
-
@mutex_write.synchronize do
|
537
|
-
STDOUT.print "Writing...\n" if @debug
|
538
|
-
@writing = true
|
539
|
-
|
540
|
-
begin
|
541
|
-
return @args[:process_meta].call_object(
|
542
|
-
"var_name" => @args[:name],
|
543
|
-
"method_name" => @args[:method_name],
|
544
|
-
"args" => buffer,
|
545
|
-
"buffered" => true,
|
546
|
-
"capture_return" => false
|
547
|
-
)
|
548
|
-
ensure
|
549
|
-
@writing = false
|
550
|
-
end
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
|
-
def _pm_close
|
555
|
-
self._pm_flush
|
556
|
-
|
557
|
-
if @args[:async]
|
558
|
-
threads_remove = []
|
559
|
-
@threads.each do |thread|
|
560
|
-
thread.join
|
561
|
-
threads_remove << thread
|
562
|
-
end
|
563
|
-
|
564
|
-
@threads -= threads_remove
|
565
|
-
end
|
566
|
-
|
567
|
-
raise @raise_error if @raise_error
|
568
|
-
end
|
569
|
-
end
|