fastthread 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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