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 CHANGED
@@ -1,3 +1,7 @@
1
1
 
2
+ v1.0.3. Make native build a noop on Rubies that have no real need for fastthread
3
+
4
+ v1.0.2. Merged stale wait entries fixes from ruby_1_8, fixed SizedQueue#enq
5
+
2
6
  v1.0.1. Signed gem.
3
-
7
+
@@ -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
@@ -1,3 +1,28 @@
1
1
  require 'mkmf'
2
2
 
3
- create_makefile('fastthread')
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
@@ -22,14 +22,14 @@ static VALUE private_eThreadError;
22
22
 
23
23
  static VALUE set_critical(VALUE value);
24
24
 
25
- /*
26
- * call-seq:
27
- * Thread.exclusive { block } => obj
28
- *
29
- * Wraps a block in Thread.critical, restoring the original value
30
- * upon exit from the critical section, and returns the value of the
31
- * block.
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 Qundef;
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
- return rb_rescue2(rb_thread_wakeup, thread,
199
- NULL, Qundef, private_eThreadError, 0);
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
- return rb_rescue2(rb_thread_run, thread,
206
- NULL, Qundef, private_eThreadError, 0);
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
- waking = wake_thread(shift_list(list));
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 void
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
- assert_no_survivors(List *waiting, const char *label, void *addr)
263
+ kill_waiting_threads(List *waiting)
255
264
  {
256
265
  Entry *entry;
266
+
257
267
  for (entry = waiting->entries; entry; entry = entry->next) {
258
- if (RTEST(wake_thread(entry->value))) {
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
- assert_no_survivors(&mutex->waiting, "mutex", mutex);
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 RTEST(mutex->owner) ? Qtrue : Qfalse;
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 (RTEST(mutex->owner))
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
- while (RTEST(mutex->owner)) {
395
- wait_list(&mutex->waiting);
396
- rb_thread_critical = 1;
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 (!RTEST(mutex->owner)) {
426
- return Qundef;
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
- rb_thread_critical = 1;
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
- if (RTEST(waking)) {
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
- rb_thread_critical = 1;
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 == Qundef) {
515
+ if (!RTEST(waking)) {
503
516
  return Qnil;
504
517
  }
505
518
 
506
- if (RTEST(waking)) {
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
- assert_no_survivors(&condvar->waiting, "condition variable", condvar);
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
- rb_thread_critical = 1;
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
- rb_thread_critical = 1;
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
- assert_no_survivors(&queue->mutex.waiting, "queue", queue);
780
- assert_no_survivors(&queue->space_available.waiting, "queue", queue);
781
- assert_no_survivors(&queue->value_available.waiting, "queue", queue);
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
- rb_raise(rb_eRuntimeError, "expected Array of queue data");
836
+ rb_raise(rb_eTypeError, "expected Array of queue data");
823
837
  }
824
838
  if (RARRAY(array)->len < 1) {
825
- rb_raise(rb_eRuntimeError, "missing capacity value");
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"));
@@ -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.1"
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(">= 0") if s.respond_to? :required_rubygems_version=
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{2007-10-26}
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.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"]
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{0.9.4.6}
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
- # # Original Rakefile source (requires the Echoe gem):
29
- #
30
- #
31
- # require 'echoe'
32
- #
33
- # Echoe.new("fastthread") do |p|
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.1
7
- date: 2007-10-26 00:00:00 -04:00
8
- summary: Optimized replacement for thread.rb primitives
9
- require_paths:
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
- has_rdoc: true
20
- required_ruby_version: !ruby/object:Gem::Requirement
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
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
- -----BEGIN CERTIFICATE-----
59
- MIIDPzCCAiegAwIBAgIBADANBgkqhkiG9w0BAQUFADBOMRwwGgYDVQQDDBNtb25n
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
- post_install_message:
80
- authors:
81
- - MenTaLguY <mental@rydia.net>
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
- test_files:
94
- - test/test_all.rb
95
- rdoc_options: []
96
-
97
- extra_rdoc_files: []
98
-
99
- executables: []
100
-
101
- extensions:
102
- - ext/fastthread/extconf.rb
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
- dependencies: []
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
@@ -1,2 +0,0 @@
1
- šiLX�\4��2�dF������=��WG�k���H��H������X���t�
2
- �O�G�7�T�"؊��U�V�9�4g��*�qH� �c�oG_Iv�?�ޣ��C_��|e���:�1��&�������� ��ӻ�p5�o��`F�cLvdc��¼׸g����}V.Q�1��-�����Z��X|��;�SK�Pr����yA�|O����ħP?�؊����'�V?Υ��E���K��B�r�$