fastthread 1.0.1 → 1.0.3
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/CHANGELOG +5 -1
- data/Rakefile +26 -0
- data/ext/fastthread/extconf.rb +26 -1
- data/ext/fastthread/fastthread.c +70 -55
- data/fastthread.gemspec +17 -38
- data/setup.rb +0 -0
- metadata +49 -86
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -2
data/CHANGELOG
CHANGED
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'echoe', '>=2.7.11'
|
4
|
+
require 'echoe'
|
5
|
+
|
6
|
+
Echoe.new("fastthread") do |p|
|
7
|
+
p.project = "mongrel"
|
8
|
+
p.author = "MenTaLguY <mental@rydia.net>"
|
9
|
+
p.email = "mental@rydia.net"
|
10
|
+
p.summary = "Optimized replacement for thread.rb primitives"
|
11
|
+
p.extensions = "ext/fastthread/extconf.rb"
|
12
|
+
p.clean_pattern = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log', "ext/fastthread/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/fastthread/Makefile", "pkg", "lib/*.bundle", "*.gem", ".config"]
|
13
|
+
|
14
|
+
p.need_tar_gz = false
|
15
|
+
p.need_tgz = true
|
16
|
+
p.require_signed = false
|
17
|
+
|
18
|
+
p.eval = proc do
|
19
|
+
if Platform.windows?
|
20
|
+
self.platform = Gem::Platform::CURRENT
|
21
|
+
self.files += ['lib/fastthread.so']
|
22
|
+
task :package => [:clean, :compile]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/ext/fastthread/extconf.rb
CHANGED
@@ -1,3 +1,28 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
3
|
+
version_components = RUBY_VERSION.split('.').map { |c| c.to_i }
|
4
|
+
|
5
|
+
need_fastthread = ( !defined? RUBY_ENGINE )
|
6
|
+
need_fastthread &= ( RUBY_PLATFORM != 'java' )
|
7
|
+
need_fastthread &= ( version_components[0..1] == [1, 8] && ( version_components[2] < 6 || version_components[2] == 6 && RUBY_PATCHLEVEL < 111 ) )
|
8
|
+
|
9
|
+
if need_fastthread
|
10
|
+
create_makefile('fastthread')
|
11
|
+
else
|
12
|
+
File.open('Makefile', 'w') do |stream|
|
13
|
+
CONFIG.each do |key, value|
|
14
|
+
stream.puts "#{key} = #{value}"
|
15
|
+
end
|
16
|
+
stream.puts
|
17
|
+
stream << <<EOS
|
18
|
+
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
19
|
+
|
20
|
+
default:
|
21
|
+
|
22
|
+
install:
|
23
|
+
mkdir -p $(RUBYARCHDIR)
|
24
|
+
touch $(RUBYARCHDIR)/fastthread.rb
|
25
|
+
|
26
|
+
EOS
|
27
|
+
end
|
28
|
+
end
|
data/ext/fastthread/fastthread.c
CHANGED
@@ -22,14 +22,14 @@ static VALUE private_eThreadError;
|
|
22
22
|
|
23
23
|
static VALUE set_critical(VALUE value);
|
24
24
|
|
25
|
-
|
26
|
-
*
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
static VALUE
|
26
|
+
thread_exclusive(VALUE (*func)(ANYARGS), VALUE arg)
|
27
|
+
{
|
28
|
+
VALUE critical = rb_thread_critical;
|
29
|
+
|
30
|
+
rb_thread_critical = 1;
|
31
|
+
return rb_ensure(func, arg, set_critical, (VALUE)critical);
|
32
|
+
}
|
33
33
|
|
34
34
|
typedef struct _Entry {
|
35
35
|
VALUE value;
|
@@ -132,7 +132,7 @@ shift_list(List *list)
|
|
132
132
|
VALUE value;
|
133
133
|
|
134
134
|
entry = list->entries;
|
135
|
-
if (!entry) return
|
135
|
+
if (!entry) return Qnil;
|
136
136
|
|
137
137
|
list->entries = entry->next;
|
138
138
|
if (entry == list->last_entry) {
|
@@ -192,18 +192,27 @@ array_from_list(List const *list)
|
|
192
192
|
return ary;
|
193
193
|
}
|
194
194
|
|
195
|
+
static VALUE return_value(VALUE value) {
|
196
|
+
return value;
|
197
|
+
}
|
198
|
+
|
195
199
|
static VALUE
|
196
200
|
wake_thread(VALUE thread)
|
197
201
|
{
|
198
|
-
|
199
|
-
|
202
|
+
#if RUBY_VERSION_MINOR == 8 && RUBY_VERSION_TEENY >= 6 && RUBY_PATCHLEVEL > 31
|
203
|
+
return rb_thread_wakeup_alive(thread);
|
204
|
+
#else
|
205
|
+
return rb_rescue2(rb_thread_wakeup, thread, return_value, Qnil, private_eThreadError, (VALUE)0);
|
206
|
+
#endif
|
200
207
|
}
|
201
208
|
|
202
209
|
static VALUE
|
203
210
|
run_thread(VALUE thread)
|
204
211
|
{
|
205
|
-
|
206
|
-
|
212
|
+
thread = wake_thread(thread);
|
213
|
+
if (RTEST(thread) && !rb_thread_critical)
|
214
|
+
rb_thread_schedule();
|
215
|
+
return thread;
|
207
216
|
}
|
208
217
|
|
209
218
|
static VALUE
|
@@ -213,7 +222,7 @@ wake_one(List *list)
|
|
213
222
|
|
214
223
|
waking = Qnil;
|
215
224
|
while (list->entries && !RTEST(waking)) {
|
216
|
-
|
225
|
+
waking = wake_thread(shift_list(list));
|
217
226
|
}
|
218
227
|
|
219
228
|
return waking;
|
@@ -244,20 +253,19 @@ wait_list_cleanup(List *list)
|
|
244
253
|
return Qnil;
|
245
254
|
}
|
246
255
|
|
247
|
-
static
|
256
|
+
static VALUE
|
248
257
|
wait_list(List *list)
|
249
258
|
{
|
250
|
-
rb_ensure(wait_list_inner, (VALUE)list, wait_list_cleanup, (VALUE)list);
|
259
|
+
return rb_ensure(wait_list_inner, (VALUE)list, wait_list_cleanup, (VALUE)list);
|
251
260
|
}
|
252
261
|
|
253
262
|
static void
|
254
|
-
|
263
|
+
kill_waiting_threads(List *waiting)
|
255
264
|
{
|
256
265
|
Entry *entry;
|
266
|
+
|
257
267
|
for (entry = waiting->entries; entry; entry = entry->next) {
|
258
|
-
|
259
|
-
rb_bug("%s %p freed with live thread(s) waiting", label, addr);
|
260
|
-
}
|
268
|
+
rb_thread_kill(entry->value);
|
261
269
|
}
|
262
270
|
}
|
263
271
|
|
@@ -291,6 +299,8 @@ typedef struct _Mutex {
|
|
291
299
|
List waiting;
|
292
300
|
} Mutex;
|
293
301
|
|
302
|
+
#define MUTEX_LOCKED_P(mutex) (RTEST((mutex)->owner) && rb_thread_alive_p((mutex)->owner))
|
303
|
+
|
294
304
|
static void
|
295
305
|
mark_mutex(Mutex *mutex)
|
296
306
|
{
|
@@ -307,7 +317,7 @@ finalize_mutex(Mutex *mutex)
|
|
307
317
|
static void
|
308
318
|
free_mutex(Mutex *mutex)
|
309
319
|
{
|
310
|
-
|
320
|
+
kill_waiting_threads(&mutex->waiting);
|
311
321
|
finalize_mutex(mutex);
|
312
322
|
xfree(mutex);
|
313
323
|
}
|
@@ -349,7 +359,7 @@ rb_mutex_locked_p(VALUE self)
|
|
349
359
|
{
|
350
360
|
Mutex *mutex;
|
351
361
|
Data_Get_Struct(self, Mutex, mutex);
|
352
|
-
return
|
362
|
+
return MUTEX_LOCKED_P(mutex) ? Qtrue : Qfalse;
|
353
363
|
}
|
354
364
|
|
355
365
|
/*
|
@@ -368,7 +378,7 @@ rb_mutex_try_lock(VALUE self)
|
|
368
378
|
|
369
379
|
Data_Get_Struct(self, Mutex, mutex);
|
370
380
|
|
371
|
-
if (
|
381
|
+
if (MUTEX_LOCKED_P(mutex))
|
372
382
|
return Qfalse;
|
373
383
|
|
374
384
|
mutex->owner = rb_thread_current();
|
@@ -391,11 +401,19 @@ lock_mutex(Mutex *mutex)
|
|
391
401
|
|
392
402
|
rb_thread_critical = 1;
|
393
403
|
|
394
|
-
|
395
|
-
|
396
|
-
|
404
|
+
if (!MUTEX_LOCKED_P(mutex)) {
|
405
|
+
mutex->owner = current;
|
406
|
+
}
|
407
|
+
else {
|
408
|
+
do {
|
409
|
+
wait_list(&mutex->waiting);
|
410
|
+
rb_thread_critical = 1;
|
411
|
+
if (!MUTEX_LOCKED_P(mutex)) {
|
412
|
+
mutex->owner = current;
|
413
|
+
break;
|
414
|
+
}
|
415
|
+
} while (mutex->owner != current);
|
397
416
|
}
|
398
|
-
mutex->owner = current;
|
399
417
|
|
400
418
|
rb_thread_critical = 0;
|
401
419
|
return Qnil;
|
@@ -422,12 +440,13 @@ unlock_mutex_inner(Mutex *mutex)
|
|
422
440
|
{
|
423
441
|
VALUE waking;
|
424
442
|
|
425
|
-
if (
|
426
|
-
|
443
|
+
if (mutex->owner != rb_thread_current()) {
|
444
|
+
rb_raise(private_eThreadError, "not owner");
|
427
445
|
}
|
428
446
|
|
429
447
|
mutex->owner = Qnil;
|
430
448
|
waking = wake_one(&mutex->waiting);
|
449
|
+
mutex->owner = waking;
|
431
450
|
|
432
451
|
return waking;
|
433
452
|
}
|
@@ -442,18 +461,13 @@ set_critical(VALUE value)
|
|
442
461
|
static VALUE
|
443
462
|
unlock_mutex(Mutex *mutex)
|
444
463
|
{
|
445
|
-
VALUE waking;
|
464
|
+
VALUE waking = thread_exclusive(unlock_mutex_inner, (VALUE)mutex);
|
446
465
|
|
447
|
-
|
448
|
-
waking = rb_ensure(unlock_mutex_inner, (VALUE)mutex, set_critical, 0);
|
449
|
-
|
450
|
-
if (waking == Qundef) {
|
466
|
+
if (!RTEST(waking)) {
|
451
467
|
return Qfalse;
|
452
468
|
}
|
453
469
|
|
454
|
-
|
455
|
-
run_thread(waking);
|
456
|
-
}
|
470
|
+
run_thread(waking);
|
457
471
|
|
458
472
|
return Qtrue;
|
459
473
|
}
|
@@ -496,16 +510,13 @@ rb_mutex_exclusive_unlock(VALUE self)
|
|
496
510
|
VALUE waking;
|
497
511
|
Data_Get_Struct(self, Mutex, mutex);
|
498
512
|
|
499
|
-
|
500
|
-
waking = rb_ensure(rb_mutex_exclusive_unlock_inner, (VALUE)mutex, set_critical, 0);
|
513
|
+
waking = thread_exclusive(rb_mutex_exclusive_unlock_inner, (VALUE)mutex);
|
501
514
|
|
502
|
-
if (waking
|
515
|
+
if (!RTEST(waking)) {
|
503
516
|
return Qnil;
|
504
517
|
}
|
505
518
|
|
506
|
-
|
507
|
-
run_thread(waking);
|
508
|
-
}
|
519
|
+
run_thread(waking);
|
509
520
|
|
510
521
|
return self;
|
511
522
|
}
|
@@ -576,7 +587,7 @@ finalize_condvar(ConditionVariable *condvar)
|
|
576
587
|
static void
|
577
588
|
free_condvar(ConditionVariable *condvar)
|
578
589
|
{
|
579
|
-
|
590
|
+
kill_waiting_threads(&condvar->waiting);
|
580
591
|
finalize_condvar(condvar);
|
581
592
|
xfree(condvar);
|
582
593
|
}
|
@@ -617,12 +628,17 @@ rb_condvar_alloc(VALUE klass)
|
|
617
628
|
static void
|
618
629
|
wait_condvar(ConditionVariable *condvar, Mutex *mutex)
|
619
630
|
{
|
631
|
+
VALUE waking;
|
632
|
+
|
620
633
|
rb_thread_critical = 1;
|
621
634
|
if (rb_thread_current() != mutex->owner) {
|
622
635
|
rb_thread_critical = 0;
|
623
636
|
rb_raise(private_eThreadError, "not owner of the synchronization mutex");
|
624
637
|
}
|
625
|
-
unlock_mutex_inner(mutex);
|
638
|
+
waking = unlock_mutex_inner(mutex);
|
639
|
+
if (RTEST(waking)) {
|
640
|
+
wake_thread(waking);
|
641
|
+
}
|
626
642
|
rb_ensure(wait_list, (VALUE)&condvar->waiting, lock_mutex, (VALUE)mutex);
|
627
643
|
}
|
628
644
|
|
@@ -681,8 +697,7 @@ rb_condvar_broadcast(VALUE self)
|
|
681
697
|
|
682
698
|
Data_Get_Struct(self, ConditionVariable, condvar);
|
683
699
|
|
684
|
-
|
685
|
-
rb_ensure(wake_all, (VALUE)&condvar->waiting, set_critical, 0);
|
700
|
+
thread_exclusive(wake_all, (VALUE)&condvar->waiting);
|
686
701
|
rb_thread_schedule();
|
687
702
|
|
688
703
|
return self;
|
@@ -699,9 +714,8 @@ rb_condvar_broadcast(VALUE self)
|
|
699
714
|
static void
|
700
715
|
signal_condvar(ConditionVariable *condvar)
|
701
716
|
{
|
702
|
-
VALUE waking;
|
703
|
-
|
704
|
-
waking = rb_ensure(wake_one, (VALUE)&condvar->waiting, set_critical, 0);
|
717
|
+
VALUE waking = thread_exclusive(wake_one, (VALUE)&condvar->waiting);
|
718
|
+
|
705
719
|
if (RTEST(waking)) {
|
706
720
|
run_thread(waking);
|
707
721
|
}
|
@@ -776,9 +790,9 @@ finalize_queue(Queue *queue)
|
|
776
790
|
static void
|
777
791
|
free_queue(Queue *queue)
|
778
792
|
{
|
779
|
-
|
780
|
-
|
781
|
-
|
793
|
+
kill_waiting_threads(&queue->mutex.waiting);
|
794
|
+
kill_waiting_threads(&queue->space_available.waiting);
|
795
|
+
kill_waiting_threads(&queue->value_available.waiting);
|
782
796
|
finalize_queue(queue);
|
783
797
|
xfree(queue);
|
784
798
|
}
|
@@ -819,10 +833,10 @@ rb_queue_marshal_load(VALUE self, VALUE data)
|
|
819
833
|
|
820
834
|
array = rb_marshal_load(data);
|
821
835
|
if (TYPE(array) != T_ARRAY) {
|
822
|
-
|
836
|
+
rb_raise(rb_eTypeError, "expected Array of queue data");
|
823
837
|
}
|
824
838
|
if (RARRAY(array)->len < 1) {
|
825
|
-
|
839
|
+
rb_raise(rb_eArgError, "missing capacity value");
|
826
840
|
}
|
827
841
|
queue->capacity = NUM2ULONG(rb_ary_shift(array));
|
828
842
|
push_multiple_list(&queue->values, RARRAY(array)->ptr, (unsigned)RARRAY(array)->len);
|
@@ -1162,6 +1176,7 @@ setup_classes(VALUE unused)
|
|
1162
1176
|
rb_define_method(rb_cSizedQueue, "push", rb_queue_push, 1);
|
1163
1177
|
rb_define_method(rb_cSizedQueue, "max", rb_sized_queue_max, 0);
|
1164
1178
|
rb_define_method(rb_cSizedQueue, "max=", rb_sized_queue_max_set, 1);
|
1179
|
+
rb_alias(rb_cSizedQueue, rb_intern("enq"), rb_intern("push"));
|
1165
1180
|
rb_alias(rb_cSizedQueue, rb_intern("<<"), rb_intern("push"));
|
1166
1181
|
rb_alias(rb_cSizedQueue, rb_intern("deq"), rb_intern("pop"));
|
1167
1182
|
rb_alias(rb_cSizedQueue, rb_intern("shift"), rb_intern("pop"));
|
data/fastthread.gemspec
CHANGED
@@ -1,52 +1,31 @@
|
|
1
|
-
|
2
|
-
# Gem::Specification for Fastthread-1.0.1
|
3
|
-
# Originally generated by Echoe
|
4
|
-
|
5
1
|
Gem::Specification.new do |s|
|
6
2
|
s.name = %q{fastthread}
|
7
|
-
s.version = "1.0.
|
8
|
-
|
9
|
-
s.specification_version = 2 if s.respond_to? :specification_version=
|
3
|
+
s.version = "1.0.3"
|
10
4
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">=
|
5
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
12
6
|
s.authors = ["MenTaLguY <mental@rydia.net>"]
|
13
|
-
s.date = %q{
|
7
|
+
s.date = %q{2009-03-19}
|
14
8
|
s.description = %q{Optimized replacement for thread.rb primitives}
|
15
|
-
s.email = %q{}
|
9
|
+
s.email = %q{mental@rydia.net}
|
16
10
|
s.extensions = ["ext/fastthread/extconf.rb"]
|
17
|
-
s.
|
11
|
+
s.extra_rdoc_files = ["ext/fastthread/fastthread.c", "ext/fastthread/extconf.rb", "CHANGELOG"]
|
12
|
+
s.files = ["test/test_queue.rb", "test/test_mutex.rb", "test/test_condvar.rb", "test/test_all.rb", "setup.rb", "Manifest", "ext/fastthread/fastthread.c", "ext/fastthread/extconf.rb", "CHANGELOG", "fastthread.gemspec", "Rakefile"]
|
18
13
|
s.has_rdoc = true
|
19
14
|
s.homepage = %q{}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Fastthread"]
|
20
16
|
s.require_paths = ["lib", "ext"]
|
21
17
|
s.rubyforge_project = %q{mongrel}
|
22
|
-
s.rubygems_version = %q{
|
18
|
+
s.rubygems_version = %q{1.2.0}
|
23
19
|
s.summary = %q{Optimized replacement for thread.rb primitives}
|
24
20
|
s.test_files = ["test/test_all.rb"]
|
25
|
-
end
|
26
21
|
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
# p.project = "mongrel"
|
35
|
-
# p.author = "MenTaLguY <mental@rydia.net>"
|
36
|
-
# p.summary = "Optimized replacement for thread.rb primitives"
|
37
|
-
# p.extensions = "ext/fastthread/extconf.rb"
|
38
|
-
# p.clean_pattern = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log', "ext/fastthread/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/fastthread/Makefile", "pkg", "lib/*.bundle", "*.gem", ".config"]
|
39
|
-
#
|
40
|
-
# p.need_tar_gz = false
|
41
|
-
# p.need_tgz = true
|
42
|
-
# p.require_signed = true
|
43
|
-
#
|
44
|
-
# p.eval = proc do
|
45
|
-
# if RUBY_PLATFORM.match("win32")
|
46
|
-
# platform = Gem::Platform::WIN32
|
47
|
-
# files += ['lib/fastthread.so']
|
48
|
-
# task :package => [:clean, :compile]
|
49
|
-
# end
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# end
|
26
|
+
if current_version >= 3 then
|
27
|
+
else
|
28
|
+
end
|
29
|
+
else
|
30
|
+
end
|
31
|
+
end
|
data/setup.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,84 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4.6
|
3
|
-
specification_version: 2
|
4
2
|
name: fastthread
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
- lib
|
11
|
-
- ext
|
12
|
-
email: ""
|
13
|
-
homepage: ""
|
14
|
-
rubyforge_project: mongrel
|
15
|
-
description: Optimized replacement for thread.rb primitives
|
4
|
+
version: 1.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- MenTaLguY <mental@rydia.net>
|
16
8
|
autorequire:
|
17
|
-
default_executable:
|
18
9
|
bindir: bin
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
version: "0"
|
25
|
-
version:
|
26
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
27
|
-
requirements:
|
28
|
-
- - ">="
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: "0"
|
31
|
-
version:
|
32
|
-
platform: ruby
|
33
|
-
signing_key:
|
34
|
-
cert_chain:
|
35
|
-
- |
|
36
|
-
-----BEGIN CERTIFICATE-----
|
37
|
-
MIIDUDCCAjigAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
|
38
|
-
cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
|
39
|
-
CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzI0OVoXDTA4MDkxNTEwMzI0OVow
|
40
|
-
TjEcMBoGA1UEAwwTbW9uZ3JlbC1kZXZlbG9wbWVudDEZMBcGCgmSJomT8ixkARkW
|
41
|
-
CXJ1Ynlmb3JnZTETMBEGCgmSJomT8ixkARkWA29yZzCCASIwDQYJKoZIhvcNAQEB
|
42
|
-
BQADggEPADCCAQoCggEBAMb9v3B01eOHk3FyypbQgKXzJplUE5P6dXoG+xpPm0Lv
|
43
|
-
P7BQmeMncOwqQ7zXpVQU+lTpXtQFTsOE3vL7KnhQFJKGvUAkbh24VFyopu1I0yqF
|
44
|
-
mGu4nRqNXGXVj8TvLSj4S1WpSRLAa0acLPNyKhGmoV9+crqQypSjM6XKjBeppifo
|
45
|
-
4eBmWGjiJEYMIJBvJZPJ4rAVDDA8C6CM1m3gMBGNh8ELDhU8HI9AP3dMIkTI2Wx9
|
46
|
-
9xkJwHdroAaS0IFFtYChrwee4FbCF1FHDgoTosMwa47DrLHg4hZ6ojaKwK5QVWEV
|
47
|
-
XGb6ju5UqpktnSWF2W+Lvl/K0tI42OH2CAhebT1gEVUCAwEAAaM5MDcwCQYDVR0T
|
48
|
-
BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGHChyMSZ16u9WOzKhgJSQ9lqDc5
|
49
|
-
MA0GCSqGSIb3DQEBBQUAA4IBAQA/lfeN2WdB1xN+82tT7vNS4HOjRQw6MUh5yktu
|
50
|
-
GQjaGqm0UB+aX0Z9y0B0qpfv9rj7nmIvEGiwBmDepNWYCGuW15JyqpN7QVVnG2xS
|
51
|
-
Mrame7VqgjM7A+VGDD5In5LtWbM/CHAATvvFlQ5Ph13YE1EdnVbZ65c+KQv+5sFY
|
52
|
-
Q+zEop74d878uaC/SAHHXS46TiXneocaLSYw1CEZs/MAIy+9c4Q5ESbGpgnfg1Ad
|
53
|
-
6lwl7k3hsNHO/+tZzx4HJtOXDI1yAl3+q6T9J0yI3z97EinwvAKhS1eyOI2Y5eeT
|
54
|
-
tbQaNYkU127B3l/VNpd8fQm3Jkl/PqCCmDBQjUszFrJEODug
|
55
|
-
-----END CERTIFICATE-----
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-19 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
56
15
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
cmVsLWRldmVsb3BtZW50MRkwFwYKCZImiZPyLGQBGRYJcnVieWZvcmdlMRMwEQYK
|
61
|
-
CZImiZPyLGQBGRYDb3JnMB4XDTA3MDkxNjEwMzMwMFoXDTA4MDkxNTEwMzMwMFow
|
62
|
-
PTENMAsGA1UEAwwEZXZhbjEYMBYGCgmSJomT8ixkARkWCGNsb3VkYnVyMRIwEAYK
|
63
|
-
CZImiZPyLGQBGRYCc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDk
|
64
|
-
LQijz2fICmev4+9s0WB71WzJFYCUYFQQxqGlenbxWut9dlPSsBbskGjg+UITeOXi
|
65
|
-
cTh3MTqAB0i1LJyNOiyvDsAivn7GjKXhVvflp2/npMhBBe83P4HOWqeQBjkk3QJI
|
66
|
-
FFNBvqbFLeEXIP+HiqAOiyNHZEVXMepLEJLzGrg3Ly7M7A6L5fK7jDrt8jkm+c+8
|
67
|
-
zGquVHV5ohAebGd/vpHMLjpA7lCG5+MBgYZd33rRfNtCxDJMNRgnOu9PsB05+LJn
|
68
|
-
MpDKQq3x0SkOf5A+MVOcadNCaAkFflYk3SUcXaXWxu/eCHgqfW1m76RNSp5djpKE
|
69
|
-
CgNPK9lGIWpB3CHzDaVNAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSw
|
70
|
-
MB0GA1UdDgQWBBT5aonPfFBdJ5rWFG+8dZwgyB54LjANBgkqhkiG9w0BAQUFAAOC
|
71
|
-
AQEAiKbzWgMcvZs/TPwJxr8tJ+7mSGz7+zDkWcbBl8FpQq1DtRcATh1oyTkQT7t+
|
72
|
-
rFEBYMmb0FxbbUnojQp8hIFgFkUwFpStwWBL/okLSehntzI2iwjuEtfj4ac9Q3Y2
|
73
|
-
uSdbmZqsQTuu+lEUc5C4qLK7YKwToaul+cx7vWxyk1YendcVwRlFLIBqA5cPrwo3
|
74
|
-
yyGLTHlRYn2c9PSbM1B63Yg+LqSSAa4QSU3Wv9pNdffVpvwHPVEQpO7ZDo5slQFL
|
75
|
-
Gf6+gbD/eZAvhpvmn8JlXb+LxKaFVMs2Yvrk1xOuT76SsPjEGWxkr7jZCIpsYfgQ
|
76
|
-
ALN3mi/9z0Mf1YroliUgF0v5Yw==
|
77
|
-
-----END CERTIFICATE-----
|
16
|
+
description: Optimized replacement for thread.rb primitives
|
17
|
+
email: mental@rydia.net
|
18
|
+
executables: []
|
78
19
|
|
79
|
-
|
80
|
-
|
81
|
-
|
20
|
+
extensions:
|
21
|
+
- ext/fastthread/extconf.rb
|
22
|
+
extra_rdoc_files:
|
23
|
+
- ext/fastthread/fastthread.c
|
24
|
+
- ext/fastthread/extconf.rb
|
25
|
+
- CHANGELOG
|
82
26
|
files:
|
83
27
|
- test/test_queue.rb
|
84
28
|
- test/test_mutex.rb
|
@@ -90,17 +34,36 @@ files:
|
|
90
34
|
- ext/fastthread/extconf.rb
|
91
35
|
- CHANGELOG
|
92
36
|
- fastthread.gemspec
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
37
|
+
- Rakefile
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: ""
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options:
|
42
|
+
- --line-numbers
|
43
|
+
- --inline-source
|
44
|
+
- --title
|
45
|
+
- Fastthread
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
- ext
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "1.2"
|
60
|
+
version:
|
103
61
|
requirements: []
|
104
62
|
|
105
|
-
|
106
|
-
|
63
|
+
rubyforge_project: mongrel
|
64
|
+
rubygems_version: 1.2.0
|
65
|
+
signing_key:
|
66
|
+
specification_version: 2
|
67
|
+
summary: Optimized replacement for thread.rb primitives
|
68
|
+
test_files:
|
69
|
+
- test/test_all.rb
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED