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 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�$